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可以作为一个载体,包含目标方向和数据信息。