Android 之 android.intent.category.DEFAULT 的用途以及如何使用

前言

做了多年 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
供测试使用(一般情况不使用)

参考

  1. android之android.intent.category.DEFAULT的用途和使用
  2. Android android.intent.category解析
  3. Android intent category大全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值