Intent 和 Intent 过滤器

参考官方文档:http://developer.android.com/guide/components/intents-filters.html

概述

Intent 是一个消息传递对象,用于组件之间的通信。

  • 启动 Activity:

使用startActivity() 或 startActivityForResult()

  • 启动Service

使用startService(),如果需要使用客户端-服务器接口,则将intent传递给bindService()

  • 传递广播

使用 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast()

intent类型

  • 显式 Intent

按名称(完全限定类名)指定要启动的组件,显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。

  • 隐式 Intent

不会指定特定的组件,而是声明要执行的常规操作,隐式 Intent,系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。

注意 :
使用隐式Intent启动 Service存在安全隐患,自API>21后,隐式 Intent 调用 bindService(),系统会抛出异常。

构建 Intent

一个Intent包含 如下信息:

  • 组件名称
    如果没有组件名称,则 Intent 是隐式的。系统将根据其他 Intent 信息来启动 相应组件。
  1. 如需启动特定的组件,则应指定该组件的名称。

  2. 启动 Service 时,需要 始终指定组件名称

  3. 可以使用setComponent()、setClass()、setClassName() 或 Intent 构造函数设置组件名称

  • 操作
    要执行的通用操作,很大程度上决定了其余 Intent 的构成,特别是数据和 extra 中包含的内容.
  1. ACTION_VIEW: 启动某项 Activity 向用户显示的信息

  2. ACTION_SEND: 共享 Intent

  3. 可以使用 setAction() 或 Intent 构造函数来设置action

  • 数据
    待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)
  1. 仅设置数据 URI,调用 setData()

  2. 仅设置 MIME 类型,请调用 setType()

  3. setDataAndType() 同时显式设置二者,如安装apk

  4. 要同时设置 URI 和 MIME 类型,不能调用 setData() 和 setType(),因为它们会互相抵消彼此的值

  • 类别
    附加信息字符串,大多数 Intent 均不需要类别
  1. CATEGORY_BROWSABLE 允许本身通过 Web 浏览器启动。

  2. CATEGORY_LAUNCHER 任务的初始 Activity,在系统的应用启动器中会列出

  3. 可以使用 addCategory() 指定类别

  • Extra
    附加信息的键值对
  1. putExtra(),添加键值对

  2. putExtras(), 添加bundle

  • 标志
    Intent 元数据标志

setFlags (int flags):如指定启动模式等等

注意事项

  1. 使用隐式 Intent 前,需要调用一下resolveActivity()判断结果非空,否则没有任何应用处理Intent,应用会崩溃。

  2. 使用createChooser()强制使用应用选择器

  3. 显式 Intent 始终会传递给其目标,无论组件声明的 Intent 过滤器如何均是如此。

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

接收隐式 Intent

  1. 接收隐式 Intent,在清单文件中使用 元素,仅当隐式 Intent 可以通过 Intent 过滤器之一传递时,系统才会将该 Intent 传递给应用组件

  2. 为了接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。方法 startActivity() 和 startActivityForResult() 将按照已申明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。
    如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。

  3. 确保只有自己的应用才能启动某一组件,需要该组件将 exported 属性设置为 “false”

待定 Intent

PendingIntent 对象是 Intent 对象的包装器,用例:

  1. NotificationManager执行的Intent

  2. 应用小工具执行操作时要执行的 Intent(主屏幕应用执行 Intent)

  3. 某一特定时间要执行的 Intent(Android 系统的 AlarmManager 执行 Intent)

  • 声明所需组件类型
PendingIntent.getActivity();//适用于启动 Activity 的 Intent。
PendingIntent.getService();//适用于启动 Service 的 Intent。
PendingIntent.getBroadcast();//适用于启动 BroadcastReceiver 的 Intent。

Intent 匹配

PackageManager

queryIntentActivities() :将返回能够执行那些作为参数传递的 Intent 的所有 Activity 列表

queryIntentServices(): 则可返回类似的服务列表。

queryBroadcastReceivers():列出广播接收器列表

你可能感兴趣的:(android,filter,intent)