1.使用Intent启动系统组件
Android的应用包含三种重要组件:Activity、Service、BroadcastRecevier,应用程序采用了一致的方式来启动它们--Intent,Intent就是封装了程序想要启动程序的意图,不仅如此,Intent还可以用于被启动组件交换信息。
组件类型 | 启动方法 |
---|---|
Activity | startActivity(); startActivityForResult(); |
Service | startstartActivity(); bindService(); |
BroadcastRecevier | sendBroadcast();........ |
2.Action、Category属性与intent-filter配置
Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所以完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息。通常Action属性会与Category属性结合使用。
Action要完成的只是一个抽象动作,这个动作具体由哪个组件(或者是Activity、BroadcastReceiver)来完成,Action这个字符串本身并不管。比如Android提供的标准Action:Intent.ACTION_VIEW,它只表示一个抽象的查看操作,但具体查看什么、启动哪个Activity来查看,Intent.ACTION_VIEW并不知道----这取决于Activity的<intent-filter.../>的配置,只要某个Activity的<intent-filter.../>配置中包含了该ACTION_VIEW,该Activity就有可能被启动。
下面就通过一个简单的的示例来示范Action的属性(普通字符串)作用。
public final static String CRAZYIT_ACTION = "org.crazyit.intent.action.CRAZYIT_ACTION";
Intent intent = new Intent();
//为intent设置Action属性(属性值就是普通字符串)
intent.setAction(CRAZYIT_ACTION);
startActivity(intent);
那么到底会启动哪个Activity呢?这取决于Activity配置中的<intent-filter.../>元素的配置。<intent-filter.../>元素是AndroidManifest.xml文件中<activity...../>元素的子元素。
<intent-filter.../>元素里通常可包含如下子元素:
0~n个<action..../>子元素
0~n个<category..../>子元素
0~1个<data..../>子元素
<action..../><category..../>子元素的配置非常简单,它们都可以指定androidname属性该属性的值就是一个普通字符串。
当<activity...../>元素里的<intent-filter.../>子元素里包含多个<action..../>子元素时,就表明该Activity能相应Action属性值为其中任意一个字符串的Intent。
由于上面的程序指定启动Action属性为CRAZYIT_ACTION常量的Activity,也就要求被启动Activity对应的配置元素的<intent-filter.../>元素里至少包含一个如下的<action..../>子元素:
<action android:name="org.crazyit.intent.action.CRAZYIT_ACTION"/>
需要指出的是,一个 Intent对象最多只能包括一个 Action属性,程序可调用 Intent的setAction( String str)方法来设置 Action属性值;但一个 Intent对象可以包含多个 Category 属性,程序可调用 Intent 的 addCategory( String str)方法来为 Intent i添加 Category属性。当程序创建Intent时,该 Intent默认启动 Category属性值为 Intent.CATEGORY_DEFAULT常量(常量值为 android.intent.category. DEFAULT)的组件。
因此,虽然上面程序的粗体字代码并未指定目标的 Intent的 Category属性,但该 Intent已有一个值为android.Intent.category.DEFAULT的Category属性值,因此被启动Activity对应的配置元素的<intent-filter.>元素里至少还包括一个如下的< category../>子元素:
<category android:name="android.Intent.category.DEFAULT"/>
3.指定Action、Category调用系统Activity
实际上 Android内部提供了大量标准 Action、Category常量,其中用于启动 Activity的标准 Action常量及对应的字符串如表所示
启动Activity的标准Action
Action常量 | 对应字符串 | 简单说明 |
---|---|---|
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW | android.intent.action.VIEW | 显示指定数据 |
ACTION_ATTACH_DATA | android.intent.action.ATTACH_DATA | 指定某块数据将被附加到其他地方 |
ACTION_EDIT | android.intent.action.EDIT | 编辑指定数据 |
ACTION_PICK | android.intent.action.PICK | 从列表中选择某项并返回所选的 |
ACTION_CHOOSER | android.intent.action.CHOOSER | 显示一个 Activity选择器 |
ACTION_GET_CONTENT | android.intent.action.GET_CONTENT | 让用户选择数据,并返回所选数据 |
ACTION_DIAL | android.intent.action.DIAL | 显示拨号面板 |
ACTION_CALL | android.intent.action.CALL | 直接向指定用户打电话 |
ACTION_SEND | android.intent.action.SEND | 向其他人发送数据 |
ACTION_SENDTO | android.intent.action.SENDTO | 向其他人发送消息 |
ACTION_ANSWER | android.intent.action.ANSWER | 应答电话 |
ACTION_INSER | android.intent.action.INSER | 插入数据 |
ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
ACTION_RUN | android.intent.action.RUN | 运行数据 |
ACTION_SYNC | android.intent.action.SYNC | 执行数据同步 |
ACTION_PICK_ACTMITY | android.intent.action.PICK_ACTMITY | 用于选择 Actvity |
ACTION_SEARCH | android.intent.action.SEARCH | 执行搜索 |
ACTION_WEB_SEARCH | android.intent.action.WEB_SEARCH | 执行Web搜索 |
ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试的入口点 |
Category常量及对应字符串
Category常量 | 对应字符串 | 简单说明 |
---|---|---|
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认的Category |
CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 指定该 Activity能被浏览器安全调用 |
CATEGORY_TAB | android.intent.category.TAB | 指定 Activity作为Tabactivity的Tab页 |
CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | 显示顶级程序列表中 |
CATEGORY_INFO | android.intent.category.INFO | 用于提供包信息 |
CATEGORY_HOME | android.intent.category.HOME | 设置该 Activity随系统启动而运行 |
CATEGORY_PREFERENCE | android.intent.category.PREFERENCE | 设置该 Activity是参数面板 |
CATEGORY_TEST | android.intent.category.TEST | 该 Activity是一个测试 |
CATEGORY_CAR_DOCK | android.intent.category.CAR_DOCK | 指定手机被插入汽车底座(硬件)时运行该Activity |
CATEGORY_DESK_DOCK | android.intent.category.DESK_DOCK | 指定手机被插入桌面底座(硬件)时运行该Activity |
CATEGORY_CAR_MODE | android.intent.category.CAR_MODE | 设置该Activity可在车载环域下使用 |
以上只是部分常量,详细看Android API
4.Data、Type属性与intent-filter配置
Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象。
Type属性则用于明确指定Data属性所指的类型或MIME类型,通常来说当Intent不指定Data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无须指定Type属性。
常用拨号、浏览网页
Uri uri = Uri.parse("tel:13800138000");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(uri);
startActivity(intent);
Uri uri = Uri.parse("https://www.baidu.com");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
5.Extra属性
Intent属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,它可以存入多组key-value对,这就可以通过Intent在不同Activity交换数据了。
网友评论