BroadcastReceiver是什么?

Android app可以发送广播也可以接收系统或者其它app发送的广播,是发送/订阅的设计模式。这些广播被发送当重要的事件发生的时候。例如,安卓系统发送广播当各种各样系统事件发生的时候,比如手机启动了或者手机开始充电了。应用也可以发送自定义广播,例如通知其它应用一些他们可能感兴趣的东西,比如一些新的内容被下载了。

系统广播会在系统事件发生的时候被发送出来,比如当手机进入或者退出开发者选项的时候,所有订阅了系统广播的人都可以收到这个广播。

广播它自身是被包裹在了一个Intent里面,它是有一个唯一的标识的(例如android.intent.action.AIRPLANE_MODE)。这个Intent对象同时包含了一些其它的信息,在它的字段里面,飞行模式这个intent里面就包含了一个boolean的字段来表示飞行模式是开启还是关闭的。

BroadcastReceiver能用来做什么?

接收系统发送出的重要的广播(网络变化,开机,充电)

app之间相互通信,相互拉活的手段

app内部组建间通信的手段

BroadcastReceiver分为哪几类?

从不同的纬度区分,可能分为不同的类别。

系统广播/非系统广播

全局广播/本地广播

无序广播/有序广播/粘性广播

BroadcastReceiver怎么使用?

1. 注册广播

1.1 静态注册广播

复制代码

1.2 动态注册广播

val br: BroadcastReceiver = MyBroadcastReceiver()

val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).apply {

addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)

}

registerReceiver(br, filter)

复制代码

2. 发送广播

Intent().also { intent ->

intent.setAction("com.example.broadcast.MY_NOTIFICATION")

intent.putExtra("data", "Notice me senpai!")

sendBroadcast(intent)

}

复制代码sendBroadcast(Intent("com.example.NOTIFY"), Manifest.permission.SEND_SMS)

复制代码

复制代码

3. 接收广播

private const val TAG = "MyBroadcastReceiver"

class MyBroadcastReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

StringBuilder().apply {

append("Action: ${intent.action}\n")

append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")

toString().also { log ->

Log.d(TAG, log)

Toast.makeText(context, log, Toast.LENGTH_LONG).show()

}

}

}

}

复制代码

android:permission="android.permission.SEND_SMS">

复制代码var filter = IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)

registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null )

复制代码

复制代码

BroadcastReceiver在不同版本的API中有哪些区别?

Android 9

从Android 9(API level 28)开始,NETWORK_STATE_CHANGED_ACTION广播不会携带用户的地理位置信息或者个人身份数据。

此外,当你的app运行在Android 9或者更高的手机上,系统的wifi广播也不会携带SSIDs, BSSIDs,连接信息或扫描结果。想获取以上信息,需要通过getConnectionInfo()来代替。

Android 8

从Android 8(API level 27)开始,系统加强了对静态广播的进一步限制,许多广播静态注册了也是收不到的,不过你可以采用动态注册的方式来接收这些广播。

Android 7

从Android 7(API level 24)开始,系统不会再发送ACTION_NEW_PICTURE,ACTION_NEW_VIDEO的广播。

同时从7.0开始app想要接受CONNECTIVITY_ACTION广播,需要通过动态注册广播的形式了,再通过静态广播注册的方式是不可以的了。

BroadcastReceiver发送广播和接收广播是怎样工作的?

看图吧,画了一幅图

BroadcastReceiver是怎么引发ANR的?

众所周知广播是会造成ANR的,造成ANR就是因为发送方将广播发送给AMS,然后AMS找有没有人注册,找到之后让它去执行,在执行开始之前AMS就开始为ANR进行耗时统计了,如果这个时候app进程已经存在,那么便把这个消息加入到消息队列中,等待调度,最后执行完成。如果app不存在,AMS会拉活我们的进程,然后我们的app会执行这个消息,所以如果我们被广播拉活,我们的启动时长也是会被统计到ANR的时间范围内的。

参考

android广播intent原理,Android中BroadcastReceiver详解相关推荐

  1. android 静态注册wifi广播,Android中BroadcastReceiver详解

    BroadcastReceiver是什么? Android app可以发送广播也可以接收系统或者其它app发送的广播,是发送/订阅的设计模式.这些广播被发送当重要的事件发生的时候.例如,安卓系统发送广 ...

  2. Android面试基础之BroadcastReceiver详解(斗帝养成系列四)

    斗帝养成 大斗师,一至九星,斗气铠甲,斗气外放,聚气化固态,呈菱形.别说自己尽力了,那只是自欺欺人的假话. Android面试基础之Activity详解(斗帝养成系列一) Android面试基础之Se ...

  3. Android 广播实现原理解析

    Android 广播实现原理解析 前言 Android四大组件中的BroadcastReceiver,在我们实际工作中被频繁的使用,我们可以利用系统的开机广播,网络状态改变的广播等等实现我们的业务逻辑 ...

  4. android广播 有序 无序,Android中的有序和无序广播浅析

    BroadcastReceiver所对应的广播分两类:无序广播和有序广播. 无序广播即为我们平时经常使用的广播,其主要是通过public abstract void sendBroadcast (In ...

  5. android 辅助功能原理,Android辅助功能原理与基本使用详解-AccessibilityService

    Android辅助功能原理与基本使用详解-AccessibilityService 辅助功能原理与基本使用详解 本文主要介绍辅助功能的使用 辅助功能基本原理 辅助功能基本配置和框架搭建 辅助功能实战解 ...

  6. android中getSystemService详解

    原文地址:android中getSystemService详解作者:邹斌 http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blo ...

  7. android中界面滑动延伸,android中ViewPager详解--视图滑动、界面卡等效果 (三)

    GuideActivity.java引导界面: import java.util.ArrayList; import java.util.List; import android.app.Activi ...

  8. android中ViewPager详解--视图滑动、界面卡等效果 (三)

    2019独角兽企业重金招聘Python工程师标准>>> GuideActivity.java引导界面: import java.util.ArrayList; import java ...

  9. Android低功耗蓝牙(BLE)使用详解

    代码地址如下: http://www.demodashi.com/demo/13390.html 与普通蓝牙相比,低功耗蓝牙显著降低了能量消耗,允许Android应用程序与具有更严格电源要求的BLE设 ...

最新文章

  1. NOIP2017 小凯的疑惑
  2. mysql数据库映射到内存_基于共享内存的数据库映射
  3. OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
  4. spring Transaction Propagation 事务传播
  5. Paxos算法与Zookeeper分析
  6. 重庆理工大学两江校区计算机学院,重庆理工大学两江校区国际项目9月开学
  7. MFC对话框自适应大小(四舍五入)高精度版本
  8. 小程序种的轮播图高度的算法
  9. ubuntu 下安装mplayer
  10. npm常用命令(扩展中...)
  11. 矩形嵌套-记忆化搜索(dp动态规划)
  12. 6.5. Properties
  13. 完全卸载NI系列软件的方法
  14. 新型电话诈骗手法“明天到我办公室来一下”全揭秘
  15. 华为云电脑.模式_云电脑还是云手机,为何阿里、华为都要做?
  16. 耐得住寂寞,守得住繁华
  17. centos英文版下如何安装中文语言包
  18. 生存曲线 p值 python_scikit学习线性回归中的p值(显著性)
  19. 两台电脑用网线直连传文件
  20. window server 2012 更改密钥 更改系统序列号

热门文章

  1. BCH易于使用不只是说说而已
  2. c# usercontrol ,networkcomms3.0 Invoke总结
  3. 技术分享:逆向分析ATM分离器
  4. 了解一下爬虫技术方方面面
  5. 教育安全认证体系建设项目容灾备份体系建设项目
  6. 医疗安全监控与检测平台WattsUpDoc
  7. PHP开发移动端接口
  8. phpmyadmi 上传大文件
  9. 如何给Centos添加静态地址
  10. C#选择目录对话框FolderBrowserDialog