Intent和Intent过滤器

Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个

  • 启动Activity
    startActivity()、如果您希望在 Activity 完成后收到结果,请调用 startActivityForResult()。
  • 启动服务
    通过将Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。
    如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),您可以从其他组件绑定到此服务。
  • 传递广播
    通过将Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或sendStickyBroadcast(),您可以将广播传递给其他应用。

Intent类型

  • 显式Intent
  • 隐式Intent

    隐式 Intent 如何通过系统传递以启动其他 Activity 的图解:[1] Activity A 创建包含操作描述的 Intent,并将其传递给 startActivity()。[2] Android 系统搜索所有应用中与 Intent 匹配的 Intent 过滤器。 找到匹配项之后,[3] 该系统通过调用匹配 Activity(Activity B)的 onCreate() 方法并将其传递给 Intent,以此启动匹配 Activity。

构建Intent

  • 组件名称ComponentName
    Intent的Component属性需要接受一个ComponentName对象
    这是可选项,但也是构建显式 Intent 的一项重要信息, 如果没有组件名称,则 Intent 是隐式的。
    public Intent(Context packageContext, Class cls)
    该构造方法使用传入的参数来获取Intent需要的ComponentName。ComponentName由包名和类名共同组成。传入Activity和Class创建Intent时,构造方法会通过Activity类自行确定全路径包名。
    也可以自己通过包名和类名创建ComponentName,然后使用下面的Intent方法创建显式intent:
    public Intent setComponent(ComponentName component)
    除此之外setClassName(…)方法能够自动创建组件名,所以使用该方法需要的实现代码相对较少。
    public Intent setClassName(String packageName, String className)
    例子:获取手机里app的名字和图标
        Intent startupIntent = new Intent(Intent.ACTION_MAIN);
        startupIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        PackageManager pm=getActivity().getPackageManager();
        List activities = pm.queryIntentActivities(startupIntent, 0);

        ResolveInfo mResolveInfo = mActicities.get(position);
        String appName = mResolveInfo.loadLabel(pm).toString();
        Drawable appImage=mResolveInfo.loadIcon(pm);
  • 操作Action
    代表Intent所要完成的抽象动作。
    一个Intent对象最多只能包含一个Action属性。
    调用setAction(String)方法。
    常见的操作:ACTION_VIEW,ACTION_SEND
    如果定义自己的操作,请确保将应用的软件包名称作为前缀。例如:
    static final String ACTION_TIMETRAVEL = “com.example.action.TIMETRAVEL”;

  • 类别Category
    一个包含应处理 Intent 组件类型的附加信息的字符串。 您可以将任意数量的类别描述放入一个 Intent 中,但大多数 Intent 均不需要类别。
    可以使用addCategory()指定类别。可以指定多个
    以下是一些常见类别:

    • CATEGORY_BROWSABLE
      目标 Activity 允许本身通过网络浏览器启动,以显示链接引用的数据,如图像或电子邮件。
    • CATEGORY_LAUNCHER
      该 Activity 是任务的初始 Activity,在系统的应用启动器中列出
    • CATEGORY_DEFAULT
      当创建Intent时默认的category属性为CATEGORY_DEFAULT(因此在被启动的Activity的配置元素的中要包含对应的类别)
  • Data和Type
    Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象。
    URI结构
    ://:/[||
    例如:
    content://com.example.project:200/folder/subfolder/etc
    http://www.baidu.com:80/search/info
    Android URI简介
    URI中没有指定scheme 那么URI无效。没有指定Host,URI无效。
    Type属性用于指定改Data属性所指定Uri对应的MIME类型,这种MIME可以是自定义的类型,只要符合abc/xyz格式的字符串即可。例如:“text/plain”。

    若要同时设置 URI 和 MIME 类型,请勿调用 setData()setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI 和 MIME 类型。

  • Extra
    携带完成请求操作所需的附加信息的键值对。通过Intent在多个Activity之间进行数据交互。
    可以使用各种 putExtra() 方法添加 extra 数据,每种方法均接受两个参数:键名和值。您还可以创建一个包含所有 extra 数据的 Bundle 对象,然后使用 putExtras() 将Bundle 插入 Intent 中。
    如需声明自己的 extra 键(对于应用接收的 Intent),请确保将应用的软件包名称作为前缀。 例如:
    static final String EXTRA_XXXXX = “com.example.EXTRA_XXXXX”;

  • 标志Flags
    在 Intent 类中定义的、充当 Intent 元数据的标志。 标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,它是否属于最近的 Activity 列表)。

Intent过滤器


  • 在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。
    可以有0~N元素.

  • 在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。
    可以有0~N元素

  • 使用一个或多个指定数据 URI 各个方面(scheme、host、port、path 等)和 MIME 类型的属性,声明接受的数据类型。
    Intent必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data(过滤规则中出现的data部分也出现在了Intent的data中)。
    可以有0~1个元素
<data android:mimeType=""
    android:scheme=""
    android:host=""
    android:port=""
    android:path=""
    android:pathPrefix=""
    android:pathPattern=""
    />

mimeType是指媒体类型,比如image/jpeg,audio/mpeg4-generic,video/* 等
匹配规则:
1. 过滤器只设置了mimeType类型
Intent中的mimeType属性必须一致才能匹配。
URI就为默认值即schema必须为content或file才能匹配。
2. 既有URI又有mimeType
intent的setDataAndType 就需一样

在过滤规则中如下两种方法一样



你可能感兴趣的:(学习笔记)