欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 隐式启动Activity方式之IntentFilter匹配规则

程序员文章站 2022-05-14 08:03:28
...
  • 显示调用

    Intent intent1 = new Intent(MainActivity.this, MainActivity.class);
    startActivity(intent1);
    需要明确指定被调用对象的组件信息,包括包名和类名。
  • 隐式调用

    需要Intent能够匹配目标组件的IntentFilter中设置的过滤信息,如果不匹配则无法启动目标Activity
    1.    IntentFliter中过滤信息有:action,category,data。(以上三个过滤信息在过滤列表中可以存在多个)
    2.    匹配过滤列表时,需要同时匹配三个类别才算完全匹配,只有完全匹配才能成功启动目标Activity。
    3.    一个Activity可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可启动对应的Activity。
    • action匹配规则

         ① action是一个字符串,Intent中的action必须能够和匹配规则中的action匹配,即action字符串值完全一致。
         ② action区分大小写。
         ③只要Intent中action能够匹配上过滤规则中的任意一个action即可。
         ④ 如果Intent中没有指定action,那么匹配失败。
    • category匹配规则

          ①category是一个字符串,Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。
         ② Intent中可以没有category(因为系统在调用startActivity或者startActivityForResult的时候会默认Intent加上“android.intent.category.DEFAULT”这个catrgory),因此为了Activity能够接收隐式调用,必须在intent-filter中指定“android.intent.category.DEFAULT”这个catrgory

    • data匹配规则

      data的语法结构

      Android 隐式启动Activity方式之IntentFilter匹配规则

      Android 隐式启动Activity方式之IntentFilter匹配规则
      data的数据格式介绍完毕。

      下面来看下如何匹配:

      如下过滤规则:

      <intent-filter>
          <data android:mimeType="image/*" />
      </intent-filter>
      
      该规则指定媒体类型为所有类型的图片,那么Intent中的mimeType属性必须为"image/*"才能匹配,规则中只有mimeType,没有指定URI,但是URI有默认值,为content和file,虽然没有指定URI,但是Intent中的URI部分的schema必须为content或者file才能匹配。
      为了匹配上个过滤规则,可以写出以下示例:
      Android 隐式启动Activity方式之IntentFilter匹配规则
      Android 隐式启动Activity方式之IntentFilter匹配规则

      data两种的特殊写法(作用一样):
      Android 隐式启动Activity方式之IntentFilter匹配规则



      下面举个例子:
      Android 隐式启动Activity方式之IntentFilter匹配规则
      相对应能匹配它的Intent:
      Android 隐式启动Activity方式之IntentFilter匹配规则
      new Intent中的参数为action,可以看出Intent中的参数和过滤规则的相对应能够匹配。
      Android 隐式启动Activity方式之IntentFilter匹配规则

      如何判断是否有Activity能够匹配我们的隐式Intent。判断方法有两种:

      1.PackageManager的resolveActivity方法
      找不到匹配的Activity返回null,来规避Activity报错。
              Android 隐式启动Activity方式之IntentFilter匹配规则
      Android 隐式启动Activity方式之IntentFilter匹配规则
      2.Intent的resolveActivity方法
      找不到匹配的Activity返回null,可以根据返回值判断,来规避Activity报错。
      源码:

      public ComponentName resolveActivity(PackageManager pm)
       { 
          throw new RuntimeException("Stub!");
      }
    • 另外需要注意,有一类action和category比较重要,他们是:

      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />

      这两者的共同作用是来标明这是一个入口Activity并且出现在系统的应用列表中,少其中 一个都没有意义,二者缺一不可。

      可以参考该篇博文的讲解:
      https://blog.csdn.net/lindroid20/article/details/51993247



      文章参考了书本《Android开发艺术探索》。




相关标签: Activity