《Android 开发艺术探索》读书笔记三 Intent和IntentFilter详解

来源:互联网 发布:手机淘宝抢拍神器软件 编辑:程序博客网 时间:2024/05/17 10:42

一、Intent详解

Intent封装了程序想要启动程序的意图,Android三大组件Activity,Service, 以及BroadcastReceiver都是依靠Intent来进行启动的。

1、Intent的Component属性

Intent对象的setComponent(ComponentNamecomp)方法用于设置Intent的Component属性。ComponentName包含如下几个构造器:

ComponentName(Stringpkg, String cls)ComponentName(Contextpkg, String cls)ComponentName(Contextpkg, Class<?> cls)

由以上的构造器可知, 创建一个ComponentName对象需要指定包名和类名–这就可以唯一确定一个组件类, 这样应用程序即可根据给定的组件类去启动特定的组件。例如:

ComponentName comp =new ComponentName(FirstActivity.this,SecondActivity.class);Intent intent = new Intent();intent.setComponent(comp);

以上三句代码创建了一个intent对象, 并为其指定了Component属性, 完全等价于下面的代码:

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);

除了使用setComponent()之外, 还可以使用setClass(),setClassName()来显式指定目标组件, 还可以调用getComponent()方法获得Intent中封装的ComponentName对象。

当程序采用这种形式启动组件时, 在Intent中明确的指定了待启动的组件类, 此时的Intent属于显式intent, 显式Intent应用场合比较狭窄, 多用于启动本应用中的component,因为这种方式需要提前获知目标组件类的全限定名。

而隐式Intent则通过Intent中的action,category, data属性指定目标组件需要满足的若干条件, 系统筛选出满足所有条件的component,从中选择最合适的component或者由用户选择一个component作为目标组件启动。

如果Intent中指定了ComponentName属性, 则Intent的其他属性将被忽略。

2、Intent的Action属性

action属性是一个字符串, 代表某一种特定的动作。 Intent类预定义了一些action常量, 开发者也可以自定义action。一般来说, 自定义的action应该以application的包名作为前缀, 然后附加特定的大写字符串,

Intent类的setAction()方法用于设定action,getAction()方法可以获取Intent中封装的action。

以下是Intent类中预定义的部分action:
(1)ACTION_CALL–目标组件为activity,代表拨号动作;
(2)ACTION_EDIT–目标组件为activity,代表向用户显示数据以供其编辑的动作;
(3)ACTION_MAIN–目标组件为activity,表示作为task中的初始activity启动;
(4)ACTION_BATTERY_LOW–目标组件为broadcastReceiver,提醒手机电量过低;
(5)ACTION_SCREEN_ON–目标组件为broadcast,表示开启屏幕。

3、Intent的Category属性

category属性也是一个字符串, 用于指定一些目标组件需要满足的额外条件。 Intent对象中可以包含任意多个category属性。 Intent类也预定义了一些category常量, 开发者也可以自定义category属性。

Intent类的addCategory()方法为Intent添加Category属性,getCategories()方法用于获取Intent中封装的所有category。

以下是Intent类中预定义的部分category:
(1)CATEGORY_HOME–表示目标activity必须是一个显示homescreen的activity;
(2)CATEGORY_LAUNCHER–表示目标activity可以作为task栈中的初始activity,常与ACTION_MAIN配合使用;
(3)CATEGORY_GADGET–表示目标activity可以被作为另一个activity的一部分嵌入。

4、Intent的Data属性

data属性指定所操作数据的URI,data经常与action配合使用:
如果action为ACTION_EDIT,data的值应该指明被编辑文档的URI;
如果action为ACTION_CALL,data的值应该是一个以”tel:”开头并在其后附加号码的URI;
如果action为ACTION_VIEW,data的值应该是一个以”http:”开头并在其后附加网址的URI。

Intent类的setData()方法用于设置data属性,setType()方法用于设置data的MIME类型,setDataAndType()方法可以同时设定两者。可以通过getData()方法获取data属性的值, 通过getType()方法获取data的MIME类型。

5、Intent的Extra属性

通过Intent启动一个component时, 经常需要携带一些额外的数据过去。携带数据需要调用Intent的putExtra()方法, 该方法存在多个重载方法, 可用于携带基本数据类型及其数组, String类型及其数组, Serializable类型及其数组,Parcelable类型及其数组, Bundle类型等。Serializable和Parcelable类型代表一个可序列化的对象, Bundle与Map类似,可用于存储键值对。

6、Intent的Flag属性

flag属性是一个int值, 用于通知android系统如何启动目标activity,或者启动目标activity之后应该采取怎样的后续操作。所有的flag都在Intent类中定义, 部分常用flag如下:
(1)FLAG_ACTIVITY_NEW_TASK–通知系统将目标activity作为一个新task的初始activity;
(2)FLAG_ACTIVITY_NO_HISTORY–通知系统不要将目标activity放入历史栈中;
(3)FLAG_FROM_BACKGROUND–通知系统这个Intent来源于后台操作, 而非用户的直接选择。

二、IntentFilter详解

IntentFilter类表示Intent过滤器, 大部分情况下, 每一个component都会定义一个或多个IntentFilter,用于表明其可处理的Intent。

一般来说,component的IntentFilter应该在AndroidManifest。xml文件中定义。
定义的方法: 在,, 元素中增加一个或多个子元素。如:

<!-- 声明作为程序入口的Activity--><activityandroid:name=".FirstActivity">       <intent-filter>               <action android:name="android.intent.action.MAIN"/>               <category android:name="android.intent.category.LAUNCHER"/>       </intent-filter></activity>

IntentFilter与隐式Intent:

android系统处理隐式Intent时, 会比较Intent和IntentFilter的action,data, category属性, 如果以上3个属性全都相符的话, 则IntentFilter所属的component就可以作为目标组件的候选(存在多个符合条件的component时)。

参考:
http://blog.csdn.net/luohai859/article/details/7368745

http://blog.csdn.net/zhaofangyuan/article/details/7962429

http://blog.csdn.net/wuwenxiang91322/article/details/7671593

1 0
原创粉丝点击