文章目录
- 前言
- 先说用途
- 隐式 Intent 和显式 Intent
- 显式 Intent
- 隐式 Intent
- 如何通过 Intent 找到具体的 Activity
- 总结
- category 其他用途
- 参考
前言
做了多年 Android 开发的你,如果有人问你,android 之 android.intent.category.DEFAULT 的作用是什么,你会回答上来么。
如果不会,就可以看看这一篇文章。
先说用途
如果你的 activity 支持接收 implicit intent(隐式 Intent)的话就一定要在 intent filter 中加入 android.intent.category.DEFAULT。
那么如何使用呢?在介绍使用之前,先来看看几个概念性的东西。作为多年 Android 开发的你,肯定都了如指掌了,这里简单过一下。
隐式 Intent 和显式 Intent
要弄清楚这个问题,首先需要弄明白什么是 Implicit (隐式) Intent 什么是 Explicit (显式) Intent。
显式 Intent
Explicit Intent 显式 Intent,明确的指定了要启动的 Acitivity ,比如以下Java代码:
Intent intent= new Intent(this, B.class);
隐式 Intent
Implicit Intent 没有明确的指定要启动哪个 Activity ,而是通过设置一些 Intent Filter 来让系统去筛选合适的 Acitivity 去启动。
如何通过 Intent 找到具体的 Activity
intent 到底发给哪个 activity,需要进行三个匹配,一个是 action,一个是 category,一个是 data。
在intent中是如何配置那三个匹配数据的呢,也简单说一下。
在不直接指定要跳转的 Activity 的时候,为 Intent 提供一些相关的参数,让其自动去和 AndroidManifest.xml 中已有的 Activity 去匹配。IntentFilter 在 xml 中的三個主要的参数:action,categary,data。我们通过 Intent 的构造函数或者 Intent 提供的方法可以指定这个三个参数:
intent.setAction(action);intent.setData(data);intent.addCategory(category);
intent.setAction(action);
intent.setData(data);
intent.addCategory(category);
理论上来说,如果 intent 不指定 category,那么无论 intent filter 的内容是什么都应该是匹配的。但是,如果是 implicit intent(隐式 Intent),android 默认给加上一个 CATEGORY_DEFAULT。
这样的话如果 intent filter 中没有 android.intent.category.DEFAULT 这个 category 的话,匹配测试就会失败。
所以,如果你的 activity 支持接收 implicit intent(隐式 Intent)的话就一定要在 intent filter 中加入 android.intent.category.DEFAULT。
例外情况是:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
中没有必要加入 android.intent.category.DEFAULT,当然加入也没有问题。这个是应用启动默认的第一个启动的 activity(每个应用有那么多 activity,总得有一个是第一个启动的吧)
如果自己定义的某个 Activity 要通过隐式启动,在 AndroidManifast.xm 那么必须加上android.intent.category.DEFAULT,否则不起作用
总结
每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 “android.intent.category.DEFAULT”,所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 “android.intent.category.DEFAULT” category,不然将导致 Intent 匹配失败。
并且:
1、一个 Intent 可以有多个 category,但至少会有一个,也是默认的一个 category。
2、只有 Intent 的所有 category 都匹配上,Activity 才会接收这个 Intent。
category 其他用途
除此之外,category的用途还有很多:
CATEGORY_ALTERNATIVE
设置这个 activity 是否可以被认为是用户正在浏览的数据的一个可选择的 action
CATEGORY_APP_BROWSER
和 ACTION_MAIN 一起使用,用来启动浏览器应用程序
CATEGORY_APP_CALCULATOR
和 ACTION_MAIN 一起使用,用来启动计算器应用程序
CATEGORY_APP_CALENDAR
和 ACTION_MAIN 一起使用,用来启动日历应用程序
CATEGORY_APP_CONTACTS
和 ACTION_MAIN 一起使用,用来启动联系人应用程序
CATEGORY_APP_EMAIL
和 ACTION_MAIN 一起使用,用来启动邮件应用程序
CATEGORY_APP_GALLERY
和 ACTION_MAIN 一起使用,用来启动图库应用程序
CATEGORY_APP_MAPS
和 ACTION_MAIN 一起使用,用来启动地图应用程序
CATEGORY_APP_MARKET
这个 activity 允许用户浏览和下载新的应用程序
CATEGORY_APP_MESSAGING
和 ACTION_MAIN 一起使用,用来启动短信应用程序
CATEGORY_APP_MUSIC
和 ACTION_MAIN 一起使用,用来启动音乐应用程序
CATEGORY_BROWSABLE
能够被浏览器安全调用的 activity 必须支持这个 category
CATEGORY_DEFAULT
设置这个 activity 对于默认的 action 是否是一个可选的 (隐式 Intent 启动必须的 category )
CATEGORY_EMBED
可以运行在父 activity 容器内
CATEGORY_HOME
主 activity,当应用程序启动时,它是第一个显示的 activity
CATEGORY_LAUNCHER
应该在上层的启动列表里显示
CATEGORY_MONKEY
这个 activity 可能被 monkey 或者其他的自动测试工具执行
CATEGORY_OPENABLE
用来指示一个 GET_CONTENT 意图只希望 ContentResolver.openInputStream 能够打开URI
CATEGORY_PREFERENCE
这个 activity 是一个选项卡
CATEGORY_SAMPLE_CODE
作为一个简单的代码示例使用(一般情况下不使用)
CATEGORY_SELECTED_ALTERNATIVE
设置这个 activity 是否可以被认为是用户当前选择的数据的一个可选择的 action
CATEGORY_TAB
想要在已有的 TabActivity 内部作为一个 Tab 使用
CATEGORY_TEST
供测试使用(一般情况不使用)
参考
- android之android.intent.category.DEFAULT的用途和使用
- Android android.intent.category解析
- Android intent category大全