推荐阅读:Intent详解
Intent是消息传递对象,协助组件之间的通信,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互
一、Intent有两种类型
1、显式Intent
指定特定组件,通过ComponentName直接设置需要调用的Activity对象
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
2、隐式Intent
不指定特定组件,而是设置Action、Data、Category,让系统来筛选出合适的组件。
原理分析:
image.png
-
Activity A创建Intent带有操作描述并将其传递给startActivity
-
Android系统在所有应用中
manifest
文件中声明的intent过滤器
进行比较来找到适当的组件。如果intent与intent过滤器匹配 -
系统通过调用其方法并将其传递给匹配活动Activity B。
注意:如果多个intent过滤器兼容,系统将显示一个对话框,以便用户可以选择要使用的应用程序
注意:启动时Service
,请 指定组件名称。否则,您无法确定哪些服务将响应意图,并且用户无法查看哪个服务启动。
Intent intent = new Intent();
intent.setAction("abcdefg");
startActivity(intent);
二、Intent组成部分
- componentName:目的组件
- action(动作):用来表现意图的行动
- category(类别):用来表现动作的类别
- data(数据):表示与动作要操纵的数据
- type(数据类型):对于data范例的描写
- extras(扩展信息):扩展信息
- Flags(标志位):期望这个意图的运行模式
显式Intent用component,隐式Intent用其余部分
1、componentName :明确指定Intent的目标组件的类名称
可以通过setComponent、setClass、setClassName、Intent构造
//Intent构造
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
//setComponent方法
ComponentName componentName = new ComponentName(this, SecondActivity.class);
// 或者ComponentName componentName = new ComponentName(this, "com.example.app016.SecondActivity");
// 或者ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.app016.SecondActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
//setClass/setClassName方法
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
// 或者intent.setClassName(this, "com.example.app016.SecondActivity");
// 或者intent.setClassName(this.getPackageName(), "com.example.app016.SecondActivity");
startActivity(intent);
Action :用来表现意图的行动
只能指定一个Intent
Intent类中,定义了批量的Action,比如ACTION_VIEW,ACTION_PICK
2、category(类别):用来表现动作的类别
可以指定多个category,类别越多,动作越具体,意图越明确
注意
:
-
清单文件中:一定要指定action和category,如要使用默认值,则设为android.intent.category.DEFAULT
-
自己定义的某个Activity要通过隐式启动,在AndroidManifast.xm那么必须加上android.intent.category.DEFAULT,否则不起作用
-
代码中:如果没有指定category,就默认为android.intent.category.DEFAULT
-
只有action和所有category同时匹配,才算匹配成功。
-
如果有多个组件被匹配成功,就会以对话框列表的方式让用户进行选择。
举个例子
清单文件声明:
<activity android:name=".intent.TestActivity">
<intent-filter>
<action android:name="com.example.lenovo.mpplication001.actiontest"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.lenovo.mpplication001.categorytest"/>
</intent-filter>
</activity>
代码隐式启动:
Intent intent = new Intent();
intent.setAction(com.example.lenovo.mpplication001.actiontest);
intent.addCategory(com.example.lenovo.mpplication001.categorytest);
startActivity(intent);
3、Data & Type:Url和数据类型
解释:
- 清单文件只有data标签。
- 代码中分为data 和 type。(和清单文件的data相关属性进行匹配)
A、data标签
属性 | 解释 |
---|---|
scheme | 协议 |
host | 主机 |
port | 端口 |
path | 用来匹配完整的路径 |
pathPrefix | 用来匹配路径的开头部分 |
pathPattern | 用表达式来匹配整个路径 |
mimeType | 用来匹配数据类型或MIME类型 |
mimeType 用于type,其他属性用于Url的指定(也就是代码中的data),规则:scheme://host:port/path or pathPrefix or pathPattern`
属性还有android:ssp , android:sspPrefix 以及 android:sspPattern用于特殊处理
推荐阅读:通过 android:ssp 高效过滤 Android Intents
B、代码中的data 和 type
方法有(这里的data指的是Url对象,uri代表数据的地址,属于一种标识符):
- setType 调用后设置 mimeType,然后将 data 置为 null;
- setData 调用后设置 data,然后将 mimeType 置为 null;
- setDataAndType 调用后才会同时设置 data 与 mimeType。
举个例子
例子1,设置data:
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" android:host="www.baidu.com"/>
</intent-filter>
intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data=Uri.parse("http://www.baidu.com");
intent.setData(data);
startActivity(intent);
image.png
例子2,设置type:
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setType("text/plain");
startActivity(intent);
image.png
推荐阅读:
Android 常用 mimeType 表
intent-filter 之 data 「scheme, host, port, mimeType, path, pathPrefix, pathPattern」
extras和Flags
- extras(扩展信息):扩展信息
- Flags(标志位):期望这个意图的运行模式,也就是四个启动模式
推荐阅读:intent.setFlags方法中的参数值含义
Intent的常见应用
推荐阅读:官方文档之Intent的常见应用
网友评论