Android系列课程之十:Intents and Intent Filters(一)

Android系列教程之十:Intents and Intent Filters(一)???? 当然,我们也可以自定义Action,比如com.flysnow.

Android系列教程之十:Intents and Intent Filters(一)

???? 当然,我们也可以自定义Action,比如com.flysnow.intent.ACTION_ADD,定义Action的时候最好能表明意思,要做什么,这样我们的Intent中的数据才好填充。Intent对象的getAction()可以获取动作,使用setAction()可以设置动作。

Data(数据)

????? Data,其实就是一个URI,用于执行一个Action时所用到的数据的URI和MIME。不同的Action有不同的数据规格,比如ACTION_EDIT动作,数据就可以能包含一个用于编辑文档的URI,如果是一个ACTION_CALL动作,那么数据就是一个包含了tel:6546541的数据字段,所以上面提到的自定义Action时要规范命名。数据的URI和类型对于Intent的匹配是很重要的,Android往往根据数据的URI和MIME找到能处理该Intent的最佳目标组件。

Category(类别)

???? Category指定了用于处理Intent的组件的类型信息,一个Intent可以添加多个Category,使用addCategory()方法即可,使用removeCategory()删除一个已经添加的类别。Android的Intent类里定义了很多常用的类别,可以参考使用。

Extras(附加信息)

????? 有些用于处理Intent的目标组件需要一些额外的信息,那么就可以通过Intent的put..()方法把额外的信息塞入到Intent对象中,用于目标组件的使用,一个附件信息就是一个key-value的键值对..Intent有一系列的put和get方法用于处理附加信息的塞入和取出。

Flag(标识)

???? Android有很多标识,用于标记如何启动一个活动,是NEW_TASK还是其他等等,以及启动后怎么对待这个活动。。可以参考Intent类中的FLAG常量字段。

三:Intent的解析

???? 介绍完了Intent对象的构成,就要介绍Android系统是怎样解析Intent的,Android是怎么传递Intent到目标组件的呢?

Intent分类

????? Intent可以分为两类,一类是显式的Intent,一类是隐式的Intent,上面有过提及。显示的Intent就是指定了组件名字的,隐式的就是没有指定Intent的组件名字,需要Android根据Intent中的Action、data、Category等来解析匹配。而目标组件(Activity、Service、Broadcast Receiver)怎通过设置他们的Intent Filter来界定其处理的Intent。如果一个组件没有定义Intent Filter,那么它只能接受处理显示的Intent,只有定义了Intent Filter的组件才能同时处理隐式和显示的Intent。

Action检测

???? 为了对Action的作用进行检测,我们使用一个例子来演示Action的作用。项目名为Intents,应用名为Intents and Filters,运行在Android2.2版本上.主启动Activity为IntentsTestList

    IntentsTestList代码如下:
    ?这里主要是使用ListActivity列出3个测试,一个测试空的Intent,一个测试只有Action的Intent--Activity版,一个测试只有Action的Intent--Broadcast版。。。为了测试startActivity(),我们新建一个Activity名字为ActionActivity代码如下:
    ?很简单,为我们的ActionContext加上了两个action标签和一个category标签,加category标签设置成android.intent.category.DEFAULT是为了让这个Activity可以接收隐式的Intent请求,这是Android规定的,对于Activity,使用Context.startActivity()传递隐式Intent,默认是包含了android.intent.category.DEFAULT的,所以定义的Activity要想接收,必须在Intent Filter里添加android.intent.category.DEFAULT这个Category。运行入下图:
    Android系列课程之十:Intents and Intent Filters(一)
    ?当点击“空Action的Activity”的时候,会报异常,因为Intent什么都没有设置,没有任何的Activity能处理它。当点击“Action检测-Activity”的时候会打开我们的ActionActivity这个Activity,点击“Action检测-Broadcast”会弹出Toast提示,说明已经被接收到。。从上面我们可以看出,当Intent设置了Action时,只要对应的组件的Intent Filter中包含该Action的定义,那么这个组件就会接收该Intent。。。
写道因为内容较多,,所以进行了分节。。。这样也会使得看本章带的Demo的时候不至于迷糊,因为这个Demo就只是实现了这一个功能。如果多个功能测试的话,就会在Demo改来改去,导致Demo代码不清晰了。未完待续,敬请期待!!! 1 楼 it_rockman 2011-07-18   楼主写的不错,能不能写一个专门演示 Category 检测的例子,谢谢! 2 楼 飞雪无情 2011-07-18   it_rockman 写道楼主写的不错,能不能写一个专门演示 Category 检测的例子,谢谢!

教程的第二部分有的。。http://flysnow.iteye.com/blog/965527 3 楼 xiaogouxo 2011-10-31   很精彩,谢谢! 4 楼 yxwww 2011-12-23   正在找相关的资料,之前看了您的那个  text阅读器,
可以在打开 a.txt的时候选择阅读器,
有个问题:
1、如果这个时候阅读器没打开,那么,会正常打开a.txt
2、如果这个时候阅读器已经打开了,那么,不会正常打开a.txt
请问,怎么解决这个问题呢?
注册一个广播? 5 楼 飞雪无情 2011-12-23   yxwww 写道正在找相关的资料,之前看了您的那个  text阅读器,
可以在打开 a.txt的时候选择阅读器,
有个问题:
1、如果这个时候阅读器没打开,那么,会正常打开a.txt
2、如果这个时候阅读器已经打开了,那么,不会正常打开a.txt
请问,怎么解决这个问题呢?
注册一个广播?

不会正常?有什么提示? 6 楼 yxwww 2011-12-23   yxwww 写道正在找相关的资料,之前看了您的那个  text阅读器,
可以在打开 a.txt的时候选择阅读器,
有个问题:
1、如果这个时候阅读器没打开,那么,会正常打开a.txt
2、如果这个时候阅读器已经打开了,那么,不会正常打开a.txt
请问,怎么解决这个问题呢?
注册一个广播?
你的程序没那个问题,,我写了个类似的,却有问题了。。。
在onStart的时候getIntent() == null
不知道为何