您的位置:首页 > 移动开发 > Android开发

【笨鸟先飞】android重新学习日记5---intent

2017-08-11 16:26 232 查看
intent,中文翻译是“意图”。

我的理解:intent,主动和其他程序交流的机制。

 

也建议初学者,按照这个来理解,虽然在使用时,有那么一些情况,不是用作主动和其他程序交流,但那是少数,大多数intent就是主动用来和其他程序交流。

 

什么叫主动,什么叫被动。上一章其实也涉及这个问题。

方法A调用方法B,那么叫做调用,也叫做主动。

方法A在某种情况下,被触发,那么叫做回调,也叫做被动。

 

这里主动和别的程序交流,进行到我这里,我要进行某个行为,我还要求对方立刻响应我这个行为。想要这样做,就要用到intent。

 

intent是一个类,而每一次使用时,我们会创建一个intent对象,这个对象需要完成两个任务。找到另一个程序和告诉程序他要干什么,通过这两个任务,我们来体会intent这个类的参数,以及用法。

 

任务1:找到另一个程序

 

A.精确查找

 

识别我们已知的程序,我们需要用packageName(包名)和className(类名)

 

将这两者合到一起,称做componentName。通过以上的信息,我们就能明确是哪个,实际上时候只需要知道packageName就可以锁定程序,但是我们不能排除两个程序包名恰好一样,所以用componentName更好。

 

于是在intent对象里面有一个属性叫做“component”属性。

 

ComponentName cn = new ComponentName(packageName,ClassName);  

Intent.setcomponent(cn);

 

其中packageName和ClassName就是字符串String类型。

 

比如我们想启动程序就startActivity(intent);

这样一瞬间就在当前的程序中,启动了其他程序。

 

在比如绑定serveice,也一样。设置了component的intent可以准确的寻找到目标程序,然后和目标程序有交互。

 

B.模糊查找

 

Action、Category、intent-filter

模糊匹配是一种双向的匹配的,

 

Action可以是自己任意取的字符串,然后intent.setaction(String)放入同样的字符串。根据字符串就能过找到相应的程序。

 

为什么叫做双向匹配,因为除了主程序需要写Action以外,目标程序也需要在自己的manifest里面写上intent-filter.

 

<intent-filter>

    <action android:name="this.is.an.action"/>

</intent-filter>

 

当然其实,即使用前一种方案,packageName目标程序也得有packageName,所以这个双向这个说法不是那么准确,但是我们都统一说出了双向这个词语,可以起到提示的作用。因为只要写一个程序,就一定有packageName,不会忘记的。而是用action和Category的话,则必须要目的程序主动在manifest里面添加。

 

使用模糊匹配的时候,有个念头,使用模糊匹配不是因为我们不知道目标程序,而是我们不确定这次行为的目标程序。有可能我们不是一定要做这个行动,或者我们不一定非要这个程序来做这个行动。

 

Action是指一种行为,对于这些行为我们有专门的命名思路,以及android给了预置的Action。 上面那个例子是自定义action。
在模糊查找时除了Action之外,还有Category匹配,这个是指进行Action时的环境。

 

这里的含义是,目的程序会设定一些条件,在某些环境下能够进行其他程序要求的某些行为。

然后我们的程序,根据我们希望做的行为和环境,让目标程序来完成这个事情。

实际上,大多数情况,不会涉及太多的约束条件,往往一对多,多对一,以及多对多的时候,会进行比较复杂的intent范围确定。

 

任务2:告诉程序他要干什么

 

告诉程序要干什么,分为两步,第一告诉希望它做什么事情,第二提供做这件事的相关信息。

 

第一步,就是技术前面的模糊查找。

 

告诉目的程序,我们希望它做什么有两个途径:

1.通过action参数,action本身会对应一种行为,是双方约定的一种暗号。

2.在启用intent的代码直接表明,比如,
startActivity就是想启动程序。

 

第二步,提供相关的信息,则是使用extra

 

这边在发送intent的时候,把extra放在里面,另外一边接收到intent的时候,在把extra取出来。

首先传输的数据是一个Bundle 类,这个东西叫做intent的extra属性。

方法1:

Bundle extra= new Bundle(); 

extra.putString(名称1, 内容1);   

extra.putString(名称2, 内容2);  

intent.putExtras(extra);

方法2:

intent.putExtra(名称1,内容1);

intent.putExtra(名称2, 内容2);

 

两种方法并没有明显的优劣,我建议,如果放置传输数据的地方和创建intent的地方在一起,且传输的数据不多(一般用intent传输是数据也不多)。使用方案2。

 

如果放置传输数据的地方和创建intent的地方不在一起,或者存放的内容不确定,或者存放的内容很多,那么使用方法1。 而且面对内容不定或很多的情况,我还建议将方案1中生成extra的部分,统一为一个方法,最后统一返回一个extra。这样代码可读性更好,维护起来也更容易。

 

总结:我认为intent就是主动和其他程序交流的机制。

通过对intent的设定,我更喜欢叫做往intent加东西,使intent可以作为一个载体,包含目标方向和数据信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: