弱龄寄事外,委怀在琴书。这篇文章主要讲述Android BrocastReceiver解析相关的知识,希望能为你提供帮助。
简介
BroadcastReceiver(广播接收器)是android四大组件之一,是一个用来响应系统范围内的广播组件,可以从Android系统和其它app发送或接收广播消息,类似于发布 - 订阅设计模式。其特点是异步的,广播发送者不会关心有无接收者接收。可应用于不同组件之间的通信、多线程通信和系统在特定情况下的通信。
原理
对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同。但总体流程大致如下:
- 广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;
- 广播发送者通过Binder机制向AMS发送广播;
- AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
- 消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
类型
- 普通广播(Normal Broadcast)
val intent = Intent()
intent.action = RECEIVE_TOKEN
sendBroadcast(intent)
- 系统广播(System Broadcast)
- 有序广播(Ordered Broadcast)
- App应用内广播(Local Broadcast)
设置局部广播方式:
- 注册广播时将exported属性设置为false
- 增设相应权限permission,用于权限验证
- 指定该广播接收器所在的包名
//注册广播,在Activity.onResume注册
val intentFilter = IntentFilter()
val broadcastReceiver = BroadcastReceiver()
intentFilter.addAction(RECEIVE_TOKEN)
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter)
//发送广播
val intent = Intent()
intent.action = RECEIVE_TOKEN
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
//取消广播,在Activity.onPause取消
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
注册
- 静态注册
<
receiver android:name="
.BroadcastReceiver"
// 继承BroadcastReceiver子类的类名
android:enabled="
boolean"
// 能否接收其他App的发出的广播
android:exported="
boolean"
// 默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
android:icon="
drawable resource"
// 广播icon
android:label="
string resource"
// 广播标签
android:permission="
string"
// 具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收
android:process="
string"
>
// 指定自己的独立进程
<
intent-filter>
<
action android:name="
com.fomin.demo.ACTION_RECEIVE_TOKEN"
/>
<
/intent-filter>
<
/receiver>
但需要注意的是,Android8.0系统对静态广播做了变更,具体可查看[https://blog.csdn.net/fomin_zhu/article/details/84454042]
- 动态注册
取消注册
override fun onResume() {
super.onResume()
//注册广播,在Activity.onResume注册
val intentFilter = IntentFilter()
intentFilter.addAction(RECEIVE_TOKEN)
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter)
}override fun onPause() {
super.onPause()
//取消广播,在Activity.onPause取消
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
}
动态广播最好在Activity?的?onResume()注册、onPause()注销,是因为对于动态广播,有注册就必然得有注销,否则会导致内存泄露;在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。
- 两者区别
- 静态注册在Manifest.xml注册,动态在代码上调用
- 静态是常驻的,不受生命周期影响,并且耗电和占内存;而动态是使用才注册,跟随组件生命周期
【Android BrocastReceiver解析】不同注册方式的广播接收器回调OnReceive()中的context返回值是不一样的
- 静态注册广播,content是android.app.ReceiverRestrictedContext,此context非Activity类型,不可直接用来构造AlertDialog
- 动态注册广播,传入onReceive()方法里的Context对象context其实就是调用sendBroadcast()的Activty对象;但LocalBroadcastManager方式返回的是Application Context
推荐阅读
- Android Navigation使用
- 46 What Is Real Happiness ? 什么是真正的幸福 ()
- Android 各种进程
- Android Activity 生命周期
- Android Intent传递对象为什么要序列化()
- Android超时机制的处理(很不错)
- Appscanner实验还原code3
- 微服务之springboot 自定义配置Application.properties文件
- Android资源收集