博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android应用被强制停止后无法接受广播解决方案
阅读量:6247 次
发布时间:2019-06-22

本文共 1178 字,大约阅读时间需要 3 分钟。

在3.1之后,系统的PackageManager增加了对处于“stopped state”应用的管理,这个stopped和Activity生命周期中的stop状态是完全两码事,包管理器中的stopped state指的是安装后从来没有启动过或者是被用户手动强制停止的应用。这点大家可以到“设置”——>"应用程序",查看任何一个安装的应用,看看“强行停止”这个按钮是否变灰就知道了。

   系统增加了2个Flag:和 ,来标识一个intent是否激活处于“stopped state”的应用。当2个Flag都不设置或者都进行设置的时候,采用的是的效果。有了上面的新机制之后,google觉得给所有的广播intent默认加上会非常的Cooooool,能在一定程度上避免流氓软件、病毒啊干坏事,还能提高效率,就导致了RECEIVE_BOOT_COMPLETED广播如果用户没有运行过应用或者在设置中强行停止了应用,就不会接收到BOOT_COMPLETED广播。

 

在android3.1以后的版本中,如果程序被强制停止后应用状态会被标记为STOPPED,此时应用无法收到其他应用的广播,要等到应用再开启一次,将STOPPED去掉以后才可以。除此之外还有一个解决方法如下:

解决办法:

  在广播发发送方发送广播时需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES

示例代码:

Intent intent = new Intent();intent.setAction("com.leeliwei.test.receiver.action.test");if (android.os.Build.VERSION.SDK_INT >= 12) {     intent.setFlags(32);//3.1以后的版本需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES}sendBroadcast(intent);

参照代码再多说两句高低版本兼容问题,if判断中为什么写>=12而不是大于>= android.os.Build.VERSION_CODES.HONEYCOMB_MR1这种常量形式。答案是我的sdk兼容从2.2版本开始的,如果写成常量形式的会报编译错误,如果调高了targetVersion(开发绑定版本),虽然编译没有错误,但在低版本运行时,会因为找不到那个常量值儿报异常终止,所以建议使用数字12。同理,intent.setFlags(32)中没有直接写常量也是这个原因,Intent.FLAG_INCLUDE_STOPPED_PACKAGES是3.1版本时才有的。低版本会报错。

转载于:https://www.cnblogs.com/chenlong-50954265/p/5729497.html

你可能感兴趣的文章
开源大数据周刊-第91期
查看>>
云计算---openstack实例共享80、443端口
查看>>
福布斯传媒选择Oracle营销云提升广告收入
查看>>
pandas入门指南
查看>>
数值的整数次方
查看>>
[20180105]oracle临时表补充.txt
查看>>
单体架构风格
查看>>
区块链主链——2018年公链发展元年
查看>>
美国专家:人工智能凛冬将至
查看>>
字符串 模式匹配
查看>>
吴恩达《深度学习》第二门课(2)优化算法
查看>>
(转)为什么选择机器学习策略
查看>>
python中的计时模块:time.time()
查看>>
阿里云出征CES:来AWS大本营展现全球布局
查看>>
Go 语言 Excel 类库 Excelize 2.0.0 版本发布
查看>>
开源中国 iOS 4.6.0 发布!软件页大改版,灰名单功能上线
查看>>
Redkale 2.0.0.alpha1 发布,Java 分布式微服务框架
查看>>
区块链凉了?我们来看一些真问题
查看>>
美国Gazelle秒杀国内二手交易网站,是如何赢的?
查看>>
敲黑板!原子变量与内存模型是什么鬼!
查看>>