Intent 与 Intent过滤器
Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作
其基本用例主要包括以下三个:
- 启动 Activity
- 启动服务
- 传递广播
Intent类型
- 显式 Intent:按名称(完全限定类名)指定要启动的组件
- 隐式 Intent :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它
从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService(),系统会引发异常
构建 Intent
Intent 中包含的主要信息如下:
- 组件名称
- 操作
- 数据
- 类别
- Extra
- 标志
显式 Intent 示例
// 在 Activity 中执行, 所以 'this' 就是当前的上下文// fileUrl 是一个URL, 类似 "http://www.example.com/image.png"Intent downloadIntent = new Intent(this, DownloadService.class);downloadIntent.setData(Uri.parse(fileUrl));startService(downloadIntent);
隐式 Intent 示例
// 创建一条文本消息Intent sendIntent = new Intent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);sendIntent.setType("text/plain");// 确定这个Intent可以匹配到Activityif (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(sendIntent);}
设置选择框标题:
Intent chooser = Intent.createChooser(sendIntent, title);
接收隐式 Intent
以下是一个使用包含 Intent 过滤器的 Activity 声明,当数据类型为文本时,系统将接收 ACTION_SEND Intent :
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter></activity>
限制对组件的访问---如果必须确保只有您自己的应用才能启动您的某一组件,请针对该组件将 exported 属性设置为 "false"