Intent总结

221 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)