Android关于No Activity found to handle Intent的问题

android 专栏收录该内容
26 篇文章 0 订阅
Android有两种Intent, 显式和隐式。 


显式的Intent,即在构造Intent对象时就指定接收者;
隐式的Intent,即Intent的发送者在构造Intent对象时,
并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合。


对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,
隐式Intent通过需要Android解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。


Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。
在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
1 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;


2 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,
  目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。


3 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,
  将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。
  同上,Intent 的scheme必须出现在目标组件的scheme列表中。


4 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。
  比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,
  解析得到的目标组件必须至少包含这两个类别。




每一个通过startActivity()方法发出的隐式Intent都至少有一个category,就是 "android.intent.category.DEFAULT",
所以只要是想接收一个隐式Intent的Activity都应该包括"android.intent.category.DEFAULT" category,不然将导致 Intent 匹配失败。


Intent-Filter的定义属性设置的例子:

<intent-filter >
    <action android:name="com.netease.push.action.client.MESSAGE"/>
    <action android:name="com.netease.push.action.client.NEWID"/>
    <action android:name="com.netease.push.action.client.METHOD"/>
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>



  • 0
    点赞
  • 1
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值