午夜稻草人

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

简单的小例子,一个是只有一个Receiver捕捉有网络改变的常驻广播,另外一个是在第一个的基础上增加了一个Activity。试验证明,第一种情况是收不到广播的! 第二种情况是可以收到广播的。所以android程序中,不能只有一个Receiver组件,必须还要Activity。据说这是google对android应用程序安全的考虑,防止流氓软件潜水消耗资源,正所谓禁止潜水也!

  • Android应用在未启动的情况下无法收到指定广播

一 、问题现象 
最近项目上遇见这样一个需求,在程序安装之后,需要收到特定广播,我当时想到的方案是在AndroidMainfest文件里添加一个静态注册的广播,比如:

 <receiver android:name=".receiver.XXXReceiver">
   <intent-filter>
        <action android:name="XXX.XXX"/>
   </intent-filter>
 </receiver> 

本以为这样就完事了,但是在测试过程中发现如果程序曾经启动过一次,那么一切都正常,如果是新安装应用,重来都没启动过,这个时候是收不到广播的。。。。

二、问题分析 
我是觉得这个不是什么多大的问题,但是测试妹子让我解决,好吧,只好网上收一收答案,一查发现这是因为Android在3.1以后将新安装的应用置为“STOPPED”状态,只有当应用启动过一次之后这个状态才会改变。 至于这样改的目的是什么啦?这个就需要大家自己去考虑了。。

三、问题解决方法 
这个问题我们需要修改两个地方来解决, 
1、在静态注册广播的时候 指定exported = true

<receiver android:name=".receiver.AddWidgetReceiver"
   android:exported="true">
   <intent-filter>
        <action android:name="XXX.XXX"/>
   </intent-filter>
 </receiver>

2、在发送intent的地方加上FLAG_INCLUDE_STOPPED_PACKAGES

Intent intent = new Intent();
intent.setAction("XXX.XXX");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);

原因是从Android 3.1开始,系统给Intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未启动的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未启动的App),用来控制Intent是否要对处于停止状态的App起作用。

posted on 2016-11-19 16:48  午夜稻草人  阅读(14696)  评论(0编辑  收藏  举报