持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
什么是Intent?
Intent是一个消息传递对象,用于组件间(Activity、Service、BroadcastReceiver)通信。
应用场景
- 启动一个Activity,startActivity(Intent)。这个Activity可以是应用内的也可以是应用外的。通过Intent指定Activity的名称为显示启动,只添加过滤条件为隐式启动,这种启动方法通过对设备上其他应用的清单文件的过滤器进行比对,查找符合条件的组件。
- 启动一个服务,startService(Intent)或者bindService(Intent)。只能显示启动,隐式启动会带来安全隐患,Android 21开始隐式启动服务将直接抛出异常
- 传递一个广播,sendBroadcast(Intent)
- 待定Intent PendingIntent
如何构建Intent
Inten中可传入组件名称(显式Intent)、操作Action、数据Data或数据类型 Type、类别Category、附加信息Extra(传入键值对或者Bundle)、标志Flags。
- 显式Intent:传入组件名称
- 隐式Intent:不指定组件名称,如果设备内没有可响应的组件,应用会直接崩溃。需要调用
Intent.resolveActivity(packageManager)判断是否有可以响应的组件,再启动。
if (intent.resolveActivity(packageManager) != null) {
startActivity(sendIntent)
}
过滤器<intent-filter>的组成:
- category类别:包含0个或多个category,需要对过滤器的所有category进行匹配。 因为在隐式启动时系统会自动将
CATEGORY_DEFAULT类别传递给隐式 Intent,所以目标组件必须包含一个<category android:name="android.intent.category.DEFAULT"/>才能响应隐式启动。 - action操作:可以有0个或多个action,只要匹配其中一个action就可以。
- data数据:可以有0个或多个data,MIME和URI一一匹配。Intent的MINE类型可由URI推测,如果过滤器只是列出 MIME 类型,则假定组件支持
content:和file:数据。
总结:过滤器中的category、action、data不需要全部匹配,但Intent设置的类别、操作、数据需要全部匹配
如何禁止Activity被隐式启动:去掉所有的<intent-filter>,将组件的exported设置为false。
使用待定Intent PendingIntent
授权外部应用使用包含的Intent,使用场景:
- 通知执行跳转操作(NotificationManager)
- 应用微件执行跳转操作
- 声明未来某一特定时间要执行的Intent(AlarmManager)