静态注册BroadcastReceiver的那些事

众所周知有两种方式去注册BroadcastReceiver,下面主要谈谈静态注册方式。

先抛出问题:

  1. 我想要 即使我的APP退出后仍然可以接收到广播,从而做我想做的事。
  2. 我想要 我的APP一安装就可以接收到广播,不用非得启动一下。

静态方式注册receiver,不就是解决上述问题的么?问动态注册和静态注册的区别,我们毫不犹豫的就回答说静态方式注册在APP退成后仍然能接收到广播。但是事实真的是这样么?

show me the code !

静态注册receiver

包名为cn.com.ada的ReceiverApp中通过静态方式注册了广播接收者MyReceiver,监听action为cn.com.ada.test的广播。

<receiver
    android:name="cn.com.ada.MyReceiver"
    android:enabled="true"
    android:exported="true">
        <intent-filter>
            <action android:name="cn.com.ada.test"/>
        </intent-filter>
</receiver>

发送广播

包名为cn.com.ada1的SendApp中发送广播。

Intent intent = new Intent("cn.com.ada.test");
sendBroadcast(intent);

测试发现:

  • 当初次安装后,如果不启动ReceiverApp,是收不到广播的。
  • 在设置应用管理中的应用详情页点击强制停止或者
    使用 adb shell am force-stop package-name命令停止ReceiverApp后,也是收不到广播的。

这是因为

从 Android 3.1 开始,系统为所有的广播都默认添加了FLAG_EXCLUDE_STOPPED_PACKAGES 标志。所有处于停止状态的应用将无法接受到该标志的广播。注意,只有两种情况下应用才会处于停止状态:

  1. 应用安装后未运行
  2. 应用被手动(设置-应用-强制停止)或者被其他应用强制停止了
    如果需要启动处于停止状态的应用,则只要为Intent添加FLAG_INCLUDE_STOPPED_PACKAGES 标记即可。
Intent intent = new Intent("cn.com.ada.test");
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);

这样才算真正实现了静态注册receiver,程序退出后仍然可以接收广播。


TODO

测试中发现一个问题,ReceiverApp运行时崩溃,弹出“ReceiverApp停止运行”的提示框,这时点击确定后,依然可以接收广播。但是,有时不会弹出提示框直接闪退,这时就接收不到广播了。不知是何原因?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1....
    Ernest_Chang阅读 740评论 0 3
  • 前言 本来想写一下广播的,发现查阅后有整理的不错的,只好转载图个简便,日后好复习转载:http://www.cnb...
    提升即效率阅读 1,413评论 0 10
  • 1.广播的分类 (1)按照发送的方式分类 标准广播是一种异步的方式来进行传播的,广播发出去之后,所有的广播接收者几...
    曹丰斌阅读 34,233评论 0 22
  • android四大组件:Activity,Service,BroadcastReceiver和ContentPro...
    毹毹阅读 2,482评论 0 9
  • Android中的广播 广播接受器,可以比喻成收音机。而广播则可以看成电台。 Android系统内部相当于已经有一...
    sunhaiyu阅读 3,290评论 1 0