没有可响应的Intent

转载 2016年05月31日 23:44:48

没有可响应的Intent

在进行intent隐式用法的学习的过程中,显示如下错误:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.example.niu.helloworld.ACTION_START cat=[com.example.niu.helloworld.MY_CATEGORY] }

我就很奇怪,因为书上举出这个错误是因为,< intent-filter>中没有没有对定义的intent对象中的category进行响应,。但是我是进行了响应了的,然后对比书上的代码,发现有一句的内容不一样

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

一种哔了狗的感觉,接着查阅了一些文档:
1. intent-filter或隐式Intent中至少有一个或一个以上的Action,至少有一个或一个以上的Category(intent中有默认的),可以有零个或零个以上的Data
2. [引用自别人的博客]:
理论上来说,如果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。
例外情况是:

< 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,否则不起作用。

3.[来自另一篇博客的解释]:
在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再 定义其他Intent内容。而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请 求意图最匹配的组件。具体的选择方法是:Android将Intent的请求内容和一个叫做Intent Filter的过滤器比较,Intent Filter中包含系统中所有可能的待选组件。如果Intent Filter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件.
  Android 如何知道应用程序能够处理某种类型的Intent 请求呢? 这需要应用程序在AndroidManifest.xml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。一个没有声明Intent Filter的组件只能响应指明自己名字的显式Intent请求,而无法响应隐式Intent请求。而一个声明了Intent Filter的组件既可以响应显式Intent请求,也可以响应隐式Intent请求。在通过和Intent Filter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准。

Action
Data
Category

而Entra和Flag在解析收到Intent时是并不起作用的。

对于category

对于一个intent要通过种类检测,intent对象中的每个种类必须匹配过滤器中的一个。即过滤器能够列出额外的种类,但是intent对象中的种类都必须能够在过滤器中找到,只有一个种类在过滤器列表中没有,就算种类检测失败!因此,原则上如果一个intent对象中没有种类(即种类字段为空)应该总是通过种类测试,而不管过滤器中有什么种类。但是有个例外,Android对待所有传递给Context.startActivity()的 隐式intent好像它们至少包含”android.intent.category.DEFAULT”(对应CATEGORY_DEFAULT常量)。 因此,活动想要接收隐式intent必须要在intent过滤器中包含”android.intent.category.DEFAULT”。
注意:
“android.intent.action.MAIN” 和 “android.intent.category.LAUNCHER”设置,它们分别标记活动开始新的任务和带到启动列表界面。它们可以包 含”android.intent.category.DEFAULT”到种类列表,也可以不包含。
所以蓝牙BluetoothOppReceiver.java中隐式发送如下:

Intent in1 = new Intent(BluetoothDevicePicker.ACTION_LAUNCH);                          
in1.putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);                            
in1.putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE,                   
                    BluetoothDevicePicker.FILTER_TYPE_TRANSFER);                                   
                     in1.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE,                               
                        Constants.THIS_PACKAGE_NAME);                                                  
                     in1.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS,                                 
                       BluetoothOppReceiver.class.getName());                                         
                        in1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                                           
context.startActivity(in1);

而BluetoothSettings在接收的时候,在AndroidManifest.xml中对于BluetoothSettings这个activity

< intent-filter>
        < action android:name="android.bluetooth.devicepicker.action.LAUNCH" />
              < !--   <category android:name="android.intent.category.DEFAULT" />-->
       < /intent-filter>

如果把这段注释掉的话,那么发送的ACTION_LAUNCH意图将不会被BluetoothSettings接收。所以要想让其接收,必须要加上这句话!

第一行代码系列第二章——更多隐式Intent用法(打开网页)

效果图 修改FirstActivity中按钮事件 Button button1 = (Button) findViewById(R.id.button_1); button1.se...
  • asdaosidasu
  • asdaosidasu
  • 2016年09月11日 13:47
  • 578

获取能响应一个Intent的所有组件信息。

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);         mainIntent.addCategory(Intent.CAT...
  • followztx
  • followztx
  • 2014年10月27日 23:08
  • 93

Android Intent机制详解

什么是Intent Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请...
  • cswhale
  • cswhale
  • 2014年08月21日 12:20
  • 1516

Android Intent和按钮响应事件的几种方式

1.通过Intent实现电话拨打 Intent intent = new Intent() ; intent.setAction(Intent.ACTION_CALL) ; intent....
  • mm9581353984
  • mm9581353984
  • 2015年10月11日 17:57
  • 210

Android-paddingIntent.Notification.自定义布局

PendingIntent 是对真实Intent的一种封装载体,可以用来在出发时,根据Intent 唤起目标组件,如 Activity,Service,BroadcastReceiver 等。 ...
  • u014304795
  • u014304795
  • 2015年02月20日 10:32
  • 755

Activity的intent响应

Intent(英文意思:意图,请求)的基本作用: Componentname:决定要启动哪一个Activity; Action:另外一个Activity要做哪些动作; Data:向另外一个Activi...
  • dancheng1
  • dancheng1
  • 2016年09月26日 14:53
  • 170

getIntent为null

Intent intent= this.getIntent(); String data = intent.getStringExtra("data"); 就可以了...
  • u014765620
  • u014765620
  • 2015年11月23日 18:40
  • 574

Intent用法——在活动之间跳转(二)

介绍了使用隐式Intent在活动之间跳转的方法。
  • weixin_36872125
  • weixin_36872125
  • 2017年03月22日 21:52
  • 182

Intent传值、传对象

很简单: 传值:intent.putExtra(); 传对象: 实体类要被序列化; Bundle bd = new Bundle(); ...
  • wuxin782515516
  • wuxin782515516
  • 2015年05月15日 17:32
  • 1628

Intent意图

Intent意图 Intent(意图)主要是解决Android应用的各项组件之间的通讯。 意图可以激活三种不同的组件: 活动activity,服务service和广播接收者 inten...
  • u013475386
  • u013475386
  • 2015年02月10日 21:58
  • 425
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:没有可响应的Intent
举报原因:
原因补充:

(最多只允许输入30个字)