`

<category android:name="android.intent.category.DEFAULT" /> 惹的祸

阅读更多
今天我自己定义了Intent的Action,可在把这个Action写入manifest的时候,没有注意到需要加入<category android:name="android.intent.category.DEFAULT" />,调试了好久才发现需要加入它,才能让系统找到你定义的Action对应的Activity,不然会一直报找不到Activity的。
官方文档写道:
The categories, if supplied, must all be listed by the activity as categories it handles. That is, if you include the categories CATEGORY_LAUNCHER and CATEGORY_ALTERNATIVE, then you will only resolve to components with an intent that lists both of those categories. Activities will very often need to support the CATEGORY_DEFAULT so that they can be found by Context.startActivity()


下面摘自:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-4941.html

1、要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent。
Explicit Intent明确的指定了要启动的Acitivity ,比如以下Java代码:
Intent intent= new Intent(this, B.class)
Implicit Intent没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。
2、intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data。
理论上来说,如果intent不指定category,那么无论intent filter的内容是什么都应该是匹配的。但是,如果是implicit intent,Android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filter中加入android.intent.category.DEFAULT。
例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。
我们定义的activity如果接受implicit intent的话,intent filer就一定要加上android.intent.category.DEFAULT这个category。


来自另一篇文章的解释:
在写 AndroidManifest.xml 的时候,一直没有搞明白,什么时候要给 Activityandroid.intent.category.DEFAULT 过滤器,现在才明白。
--------------------------------------------------------------------------------
Android treats all implicit intents passed to startActivity() as if they contained at least one category: "android.intent.category.DEFAULT" (the CATEGORY_DEFAULT constant). Therefore, activities that are willing to receive implicit intents must include "android.intent.category.DEFAULT" in their intent filters
--------------------------------------------------------------------------------
意思是说,每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 "android.intent.category.DEFAULT" category,不然将导致 Intent 匹配失败。
从上面的论述还可以获得以下信息:
1、一个 Intent 可以有多个 category,但至少会有一个,也是默认的一个 category。
2、只有 Intent 的所有 category 都匹配上,Activity 才会接收这个 Intent。
分享到:
评论
1 楼 裂风矢 2015-06-13  

相关推荐

    Android studio 之Zxing 实现二维码生成和扫描

    &lt;category android:name="android.intent.category.DEFAULT"/&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 启动扫描的代码如下: ```java Intent intent = new Intent("com.google.zxing.client.android.SCAN"); intent....

    ContentProvider

    &lt;category android:name="android.intent.category.LAUNCHER" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; &lt;provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:...

    点击浏览器中的URL链接,启动特定的App。

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;category android:name="android.intent.category.BROWSABLE" /&gt; &lt;data android:scheme="myapp" android:host="jp.app" android:pathPrefix="/...

    AndroidStudio实现QQ登录

    &lt;category android:name="android.intent.category.DEFAULT"/&gt; &lt;category android:name="android.intent.category.BROWSABLE"/&gt; &lt;data android:scheme="tencentYOUR_APP_ID"/&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ...

    android手把手教你开发launcher.pdf

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;/intent-filter&gt; ``` 运行程序 现在,我们可以运行程序了。当我们按下 Home 键时,系统将显示我们的 MyHome 应用程序,和系统的默认 Launcher ...

    Google Android揭秘第三章实例.rar

    android:name="android.intent.category.DEFAULT" /&gt; &lt;action android:name="com.msi.manning.restaurant.VIEW_LIST" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; &lt;activity android:name="ReviewDetail...

    android 8.1设置添加Ethernet功能选项

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;category android:name="android.intent.category.VOICE_LAUNCH" /&gt; &lt;category android:name="com.android.settings.SHORTCUT" /&gt;+ &lt;/intent-...

    android教程之intent的action属性使用示例(intent发短信)

    这里的`&lt;category android:name="android.intent.category.DEFAULT" /&gt;`标签很重要,它表示该Activity可以响应隐式Intent,即其他类可以不明确指定Component名称,仅通过Action来启动它。启动这个自定义Action的...

    android:scheme 通过uri跳转到APP应用指定Activity

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;category android:name="android.intent.category.BROWSABLE" /&gt; &lt;data android:scheme="myapp" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 这里,`...

    Android Intent Filter用法

    &lt;category android:name="android.intent.category.DEFAULT"/&gt; &lt;data android:mimeType="text/plain"/&gt; &lt;/intent-filter&gt; ``` 这段代码表示该组件可以处理ACTION_SEND的动作,类别是DEFAULT,并且发送的数据是纯...

    android中使用隐式intent完成应用的步骤及核心代码2022优秀文档.pptx

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;data android:mimeType="text/plain" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 使用隐式 Intent 完成应用的优点: 1. 使得应用程序之间的交互更加...

    Android应用跳转Scheme协议

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;category android:name="android.intent.category.BROWSABLE" /&gt; &lt;data android:scheme="myapp" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 这里,...

    android:scheme

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;category android:name="android.intent.category.BROWSABLE" /&gt; &lt;data android:scheme="myapp" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 在这个...

    android 8.1设置添加Ethernet功能选项patch文件

    + &lt;category android:name="android.intent.category.DEFAULT" /&gt; + &lt;category android:name="android.intent.category.VOICE_LAUNCH" /&gt; + &lt;category android:name="com.android.settings.SHORTCUT" /&gt; + &lt;/intent-...

    041集-启动带两个Category值的预定义Activity和桌面Activity

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 在这个例子中,`ACTION_MAIN`动作结合`CATEGORY_LAUNCHER`使得Activity能够出现在应用启动器中,而`CATEGORY_...

    intent-action-send.7z

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;data android:mimeType="text/plain" /&gt; &lt;/intent-filter&gt; &lt;intent-filter&gt; &lt;action android:name="android.intent.action.SEND" /&gt; &lt;category...

    android获取home键 在2.X到4.X上亲测能用

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;data android:scheme="keycode" /&gt; &lt;data android:format="int" /&gt; &lt;data android:keyEvent="26" /&gt; &lt;!-- KEYCODE_HOME --&gt; &lt;/intent-filter&gt; ...

    Android应用源码之隐藏安装包图标使用其他应用启动本应用.zip

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 在这个例子中,我们定义了一个自定义的Action名`com.example.ACTION_START_HIDDEN_APP`,其他应用可以通过发送...

    Android安卓隐藏任务栏及增加Home属性

    都需要在相应的 `AndroidManifest.xml` 文件中的 `&lt;activity&gt;` 标签内添加 `&lt;category android:name="android.intent.category.HOME" /&gt;` 和 `&lt;category android:name="android.intent.category.DEFAULT" ...

    Android Launcher研究(二)-Launcher为何物,究竟是干什么的.doc

    &lt;category android:name="android.intent.category.DEFAULT" /&gt; &lt;category android:name="android.intent.category.MONKEY" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; ``` 这里,`android.intent.category.HOME`类别使得...

Global site tag (gtag.js) - Google Analytics