常见广播的使用场景:
- 同一app内有多个进程的不同组件之间的消息通信。
- 不同app之间的组件之间消息的通信。
有序广播和无序广播区别:
无序广播是通过context.sendBroadcast(Intent)
方法发送的广播,不可拦截,当然发送的数据接受者是无法进行修改的。
有序广播是通过context.sendOrderBroadcast(Intent)
方法发送的广播,可被拦截,而且接受者是可以修改发送的数据的。下一个接受者接受的数据是上一个接受者修改过的。
本地广播
1 2 3 4 5 6
| private fun sendLocalBroadcast(context: Context, action: String) { val intent = Intent(action) LocalBroadcastManager.getInstance(context) .sendBroadcast(intent) }
|
1 2 3 4 5 6
| val localBroadcastManager = LocalBroadcastManager.getInstance(this) val intentFilter = IntentFilter() intentFilter.addAction(action) val nasbr = NextAndStartBroadcastReceiver() localBroadcastManager.registerReceiver(nasbr, intentFilter)
|
1 2 3 4 5 6
| class NextAndStartBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Toast.makeText(context, "本地广播测试", Toast.LENGTH_SHORT).show() } }
|
广播接收器的静态注册和动态注册
静态注册是指在 AndroidManifest.xml 清单文件中声明 receiver 标签并添加意图过滤器。意图过滤器中的 action 属性执行广播接收器接收的广播类型。
1 2 3 4 5
| <receiver android:name=".StaticRegisterBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
|
动态注册
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class NetworkChangeReceiver : BroadcastReceiver() {
@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE) override fun onReceive(context: Context?, intent: Intent?) {
val connMgr = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val wifiNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI) val dataNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) if (wifiNetworkInfo.isConnected && dataNetworkInfo.isConnected) { Toast.makeText(context, "WIFI已连接,移动数据已连接", Toast.LENGTH_SHORT).show() } else if (wifiNetworkInfo.isConnected && !dataNetworkInfo.isConnected) { Toast.makeText(context, "WIFI已连接,移动数据已断开", Toast.LENGTH_SHORT).show() } else if (!wifiNetworkInfo.isConnected && dataNetworkInfo.isConnected) { Toast.makeText(context, "WIFI已断开,移动数据已连接", Toast.LENGTH_SHORT).show() } else { Toast.makeText(context, "WIFI已断开,移动数据已断开", Toast.LENGTH_SHORT).show() } } }
|
1 2 3 4 5
| val networkFilter = IntentFilter() networkFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE") networkChangeReceiver = NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, networkFilter)
|
备注:需要在onDestory方法或者在此方法之前调用unregisterReceiver(networkChangeReceiver)
解除注册,避免内存泄漏。
本地广播和系统广播源码角度分析
本地广播 LocalBroadcastMananger 实现机制是通过 Handler 实现的。
系统广播实现机制和 Binder 有关。
待深入了解…