当前位置: 移动技术网 > IT编程>移动开发>Android > Android 中IntentFilter的匹配规则实例详解

Android 中IntentFilter的匹配规则实例详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

驸马 快跟本宫生个娃,问病网,邳州大蒜最新价格

intentfilter的匹配规则

intentfilter的使用

假如我们要隐式启动一个activity我们需要成功匹配activity中的任意一个intent-filter。如果要成功匹配该intent-filter我们需要完全匹配该intent-filter中的 action、category、data。

示例:

<activity android:name=".mainactivity">
  <intent-filter>
   <action android:name="com.blueberry.action"></action>
   <action android:name="com.blueberry.action1"></action>

   <category android:name="com.blueberry.category"></category>
   <category android:name="android.intent.category.default"></category>

   <data android:mimetype="text/plain"></data>
   </intent-filter>
</activity>

如果activity的过滤列表如上配置,我们在设置intent的参数时需要同时满足action、category、data才算匹配成功,只有完全匹配才能成功启动activity。(如果是broadcastreceiver的话,只需要满足action或data类型任意一个即可)。

action的匹配规则

action是一个字符串,系统预定义了一些action,同时我们也可以自己定义自己的action。action的匹配规则是intent中的action必须能够和过滤规则中的action匹配(字符串值完全一样,区分大小写)。一个过滤规则中可以有多个action,那么只要intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。另外如果过滤规则中定义了action,那么intent中也必须要有可匹配的action。

category的匹配规则

category的匹配规则是intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。换句话说intent中如果出现了category,都必须和过滤规则中的一个category相同。如果没有category的话,这个intent仍然可以匹配成功(这点和action不同)。至于为什么不设置category也能匹配?原因在于系统在调用startactivity或startactivityforresult的时候会默认加上android.intent.category.default。同时为了我们能够接受隐式调用,我们在androidmanifest.xml中的intent-filter也要指定”android.intent.category.default”这个category。

data的匹配规则

data的匹配规则与action类似,如果过滤规则中定义了data,那么intent中必须也要定义可匹配的data。同时只要intent中的action能和过滤规则中的任何一个action相同即可匹配成功

data的语法

<data
  android:host="string"
  android:path="/string"
  android:pathpattern="*"
  android:port="12"
  android:scheme="string"
  android:mimetype="text/plain"
  ></data>

data由两部分组成,mimetype和url。mimetype指媒体类型,比如image/jpeg、audio/mpeg4-generic和video/*等。而url中包含的数据就比较多了,下面是url的结构:

<schema>://<host>:<port>/[<path>|<pathprefix>|<pathpattern>]

例如:

content://com.blueberry.text:200/folder/subfolder/etc 或 http://www.baidu.com:80/search/info

另外需要注意如果在androidmanifest.xml中的配置列表中没有设置url只设置了mimetype例如:

<intent-filter>
  <action android:name="com.blueberry.second"></action>
  <category android:name="android.intent.category.default"></category>
  <data android:mimetype="text/plain"></data>
</intent-filter>

url实际上是有默认值的url的默认值为content和file。也就是说如果androidmanifest.xml中设置的跟上文一样。我们需要这样才能匹配:

inent.setdataandtype(uri.parse(file://abc),"text/plain")
或
intent.setdataandtype(uri.parse(content://abc),"text/plain")

总结

综上所述,如果要隐式启动一个activity。

1. 在androidmanifest中查看activity的匹配列表。选择一个intent-filter进行匹配。如果定义有action或data,那我们的intent中也必须要包含可以与它匹配的action或data。

2. 创建intent设置action或者data。category可以设置也可以不设置(如果设置要全部都能匹配)。

3. 保证设置的action、data、category都能正确匹配。

4. 调用启动activity的方法:startactivity或startactivityforresult。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网