Intent在Android中的重要性不言而喻。本文主要总结下Intent使用过程中需要注意的一些问题。

1.隐式Intent AndroidManifest.xml声明时<intent-filter>相关

作为“意图”的Intent,在AndroidManifest.xml声明时并没有独立的所谓的<intent>标签形式,而是依附于其他的应用程序组件(Activity/BroadcastReceiver/Service)存在。在显式Intent和隐式Intent类别上,显式Intent直接对应组件名称,隐式Intent则对应组件声明中的子节点<intent-filter>而存在。

<intent-filter>声明时需要注意如下几点:

1).<intent-filter>意为"intent匹配器",主要能够通过此“intent匹配器”的目标组件,都是“意图”的目标对象,对于启动Activity的隐式Intent,如果有多个目标Activity均可满足,将以列表弹框弹出以供用户选择具体启动对象。在<intent-filter>声明时,主要包括<action>,<category>和<data>子标签。

2).<action>作为“意图”的具体动作,在<intent-filter>中是必须要有的,一个<intent-filter>声明中可以有多个<action>子标签,表示可以匹配多个不同的相应intent action,action的具体命名最好以包名开头,以确保action的唯一性;

3).<category>作为"意图"的类别,针对隐式Activity组件,action在<intent-filter>中也是必须要有的。默认情况下,以隐式Intent方式启动Activity时系统会自动加上category “android.intent.category.DEFAULT”。这样,就导致<intent-filter>中必须至少包含有<category android:name="android.intent.category.DEFAULT" />的声明。当且仅当如下情况除外:

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

下面是关于Android文档中关于category.DEFAULT具体警示:

Note: In order to receive implicit intents, you must include the CATEGORY_DEFAULT category in the intent filter. The methods startActivity() and startActivityForResult() treat all intents as if they declared the CATEGORY_DEFAULT category. If you do not declare this category in your intent filter, no implicit intents will resolve to your activity.
Android automatically applies the the CATEGORY_DEFAULT category to all implicit intents passed to startActivity() and startActivityForResult(). So if you want your activity to receive implicit intents, it must include a category for "android.intent.category.DEFAULT" in its intent filters (as shown in the previous <intent-filter> example.

同样的,一个<intent-filter>声明中可以有多个<category>子标签。

4).一个Activity/BroadcastReceiver/Service组件声明中可以包含多个<intent-filter>标签,匹配时,针对单个的<intent-filter>依次进行匹配,总体原则是,单个<intent-filter>标签内部,各子标签应能够包含代码中intent各条件,可以多余但不能少。

2.代码中使用Intent启动其他的应用程序组件(Activity/BroadcastReceiver/Service)

1).对于显式Intent,直接指定目标组件的类名,系统会在当前App内部Intent到目标组件;

2).一个Intent中既用了显式Intent,同时又用了隐式Intent,直接以显式Intent为准;

3).隐式Intent必须通过如setAction(..)方法指定action,有此可见,隐式Intent代码中action唯一,通过addCategory (..)方法指定类别,由于category可以有多个;

4).App内部的Service启动最好使用显式Intent,原因Android文档中描述:

To ensure your app is secure, always use an explicit intent when starting a Service and do not declare intent filters for your services. Using an implicit intent to start a service is a security hazard because you cannot be certain what service will respond to the intent, and the user cannot see which service starts. Beginning with Android 5.0 (API level 21), the system throws an exception if you call bindService() with an implicit intent.

有此可见:Android 5.0开始,跨App的bindService将不再有效。

5).鉴于广播接收器本身就是由来解耦,因此,发送广播时只能使用隐式Intent;

6).当指定的Activity组件没有找到时,会抛出ActivityNotFoundException异常并直接崩溃,此时可以通过resolveActivity(..)方式先判断下:

 if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}

7).判断两个Intent“意图”是否相同,使用filterEquals(intent)方法,注意只包括intent匹配时的描述信息,并不如extra和flag等额外信息。

filterEquals(Intent other)
Determine if two intents are the same for the purposes of intent resolution (filtering).
That is, if their action, data, type, class, and categories are the same. This does not compare any extra data included in the intents.
filterHashCode()
Generate hash code that matches semantics of filterEquals().

最新文章

  1. pkcs1与pkcs8格式RSA私钥互相转换
  2. iOS 底层框架的浅析
  3. Shell入门教程:流程控制(6)while 循环
  4. 深入剖析ConcurrentHashMap(2)
  5. Qt——树的搜索
  6. CentOS6.7搭建蜜罐dionaea
  7. iOS8远程通知处理
  8. Java 与无符号那些事儿
  9. Source Insight中文乱码
  10. 防asp木马运行
  11. 模拟dispatch_once
  12. python连接redis002
  13. [编织消息框架][netty源码分析]4 eventLoop 实现类NioEventLoop职责与实现
  14. 可变参数函数(stdarg.h)的使用
  15. Oracle使用PLSQL导入数据后中文乱码的解决方法
  16. B. Lynyrd Skynyrd
  17. 前端JS插件整理
  18. sublime使用Package Control不能正常使用的解决办法
  19. Vue使用枚举类型实现HTML下拉框
  20. Python3练习题 022:用递归函数反转字符串

热门文章

  1. Linux下MakeFile初探
  2. Liferay7 BPM门户开发之39: Form表单提交的ProcessAction处理
  3. CSS3选择器的研究,案例
  4. 注意HTML的语言编码charset
  5. 前端优化-Img与background
  6. Windows 系统下Git安装图解
  7. codeforces——Little Pony and Sort by Shift
  8. Linux下如何删除Oracle
  9. c#params ref out
  10. Redis安装配置与Jedis访问数据库