Android应用在未启动的情况下无法收到指定广播的问题总结

原文链接:http://blog.csdn.net/a229413040/article/details/51791766

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

 <receiver android:name=".receiver.XXXReceiver">
   <intent-filter>
        <action android:name="XXX.XXX"/>
   </intent-filter>
 </receiver> 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

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

二、问题分析 
我是觉得这个不是什么多大的问题,但是测试妹子让我解决,好吧,只好网上收一收答案,一查发现这是因为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>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

Intent intent = new Intent();
intent.setAction("XXX.XXX");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);
 
 
  • 1
  • 2
  • 3
  • 4

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值