美文网首页
关于系统发送的广播应用接收不到的问题

关于系统发送的广播应用接收不到的问题

作者: 飞行的魔术师 | 来源:发表于2017-03-15 21:15 被阅读195次

问题解决记录

最近发现了一个问题,我们的APK只能够接收待机下去的广播,而接收不到待机起来的广播。这就很奇怪了,于是便找到了系统发送待机和待机起来广播的相关类。
frameworks\base\services\java\com\android\server\power\Notifier.java
从里面找到下面这段代码,可以看到对于开机和待机广播发送的代码其实是一样的。

mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON);
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);

既然如此,按理说我们的应用是可以接到到两个广播才对啊,不然就应该两个都收不到。于是便进一步分析自己的应用。分析后来发现,接受待机广播是静态注册的,而接收待机起来的广播是动态注册的。这时候可以注意到,两个 TAG 里面有一个Intent.FLAG_RECEIVER_REGISTERED_ONLY

我们查了一下,发现如果发送广播时设置了这个标志,那只会调用静态注册了的接收器——BroadcastReceiver组件不会被启动。所以这里就很明白了,因为我们需要比较快的接收到待机广播,从而做出处理,所以这里我们采用了优先级较高的动态注册,这样会一定程度上的防止接收不到广播的问题。那么要解决这个问题,只要在发送待机起来广播的时候把相应的TAG去掉就好,所以修改后代码如下:
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

关于广播接收器的一些参考资料

广播接收器注册的两种形式

  • 静态注册
    非常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。
  • 动态注册
    常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行

广播的类型:

  1. 有序广播

    1. 优先级高的先接收
    2. 同优先级的广播接收器,动态优先于静态
    3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
  2. 普通广播

    1. 无视优先级,动态广播接收器优先于静态广播接收器
    2. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

相关文章

  • 关于系统发送的广播应用接收不到的问题

    问题解决记录 最近发现了一个问题,我们的APK只能够接收待机下去的广播,而接收不到待机起来的广播。这就很奇怪了,于...

  • BroadCast拾遗

    1,广播的概念 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了...

  • 简述Android BroadcastReceiver

    什么是广播? 用于监听或接收系统和应用发出的广播消息,并做出响应,因此广播分为两个角色:广播发送者、广播接收者。 ...

  • 1.5 清单文件中的receiver 广播接收器

    清单文件中的 receiver 广播接收器 Android应用可以从Android系统和其他Android应用发送...

  • 我问你答-简述 Android 广播机制

    以下内容是对官方文档的理解翻译而来 广播消息 应用可以接收系统或其他应用发出的广播消息,同样也能给其他应用发送消息...

  • 广播概述

    Android应用可以从Android系统和其他Android应用发送或接收广播消息,类似于发布 - 订阅设计模式...

  • 记:BroadcastReceiver中知识点梳理

    知识点1.广播的应用范围 (1)广播可用于接收系统广播(2)广播可用于监听/接收APP发出的广播(同应用或不同应用...

  • Android广播机制详解

    Android应用程序可以从Android系统和其他Android应用程序发送或接收广播消息,类似于发布-订阅设计...

  • Android-四大组件之BroadcastReceiver

    一、定义 Android广播分为两个角色:广播发送者、广播接收者 二、作用 用于监听 / 接收应用发出的广播消息,...

  • 广播与服务

    广播接收者 BroadcastReceiver 接收系统发出的广播 现实中的广播:电台为了传达一些消息,而发送的广...

网友评论

      本文标题: 关于系统发送的广播应用接收不到的问题

      本文链接:https://www.haomeiwen.com/subject/rlyrnttx.html