第2章:BroadcastReceiver广播接收器

常见广播的使用场景:

  1. 同一app内有多个进程的不同组件之间的消息通信。
  2. 不同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?) {

//获得ConnectivityManager对象
val connMgr =
context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

//获取ConnectivityManager对象对应的NetworkInfo对象
//获取WIFI连接的信息
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 有关。

待深入了解…

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×