广播定义
顾名思义,广播的定义就是一个地方(应用)发送广播,其他多个地方(应用)可以选择接收或者不接收。
广播的用法就是,应用可以注册自己想要的广播进行接受,这些被注册的广播可能发自系统或者其他的应用。
广播的类型
标准广播,是一种无序异步执行的广播,在广播发送之后,所有注册过的接收器几乎可以同步接收到这条广播。
有序广播,是一种有序同步执行的广播,在广播发送之后,同一时刻只能被一个注册过的接收器接收,当这个接收器处理完成后才能传到下一个接收器。根据优先级高低排序且优先级高的广播接收器可以选择截断广播。
广播的注册
动态注册,在代码中注册;
静态注册,在 AndroidManifest.xml 中注册;
广播的使用
动态注册关键代码
新建一个类继承 BroadcastReceiver
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
}
}
}
在 onCreate 动态注册广播,onDestroy 释放注册。
//注册监视网络状态广播
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
//释放
unregisterReceiver(networkChangeReceiver);
在 AndroidManifest.xml 添加权限,这是 Android 为了保护用户设备的安全和隐私。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
静态注册关键代码
在 AndroidManifest.xml 进行注册。
<receiver
android:name=".BootCompleteRecevier"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
新建广播接收器类收广播
public class BootCompleteRecevier extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Hello World!", Toast.LENGTH_SHORT).show();
}
}
开机广播也需要添加权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
发送有序广播
主要在于注册广播的时候需要加上优先值保证接收的有序,发送的地方调用的函数需要改变。
//发送广播改为
Intent intent = new Intent();
intent.setAction("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);
//注册带优先值的广播
broadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.broadcasttest.MY_BROADCAST");
filter.setPriority(1000);
registerReceiver(broadcastReceiver, filter);
发送本地广播
保证广播只在应用内部传播
//获取实例
private LocalBroadcastManager localBroadcastManager;
localBroadcastManager = localBroadcastManager.getInstance(this);
//发送广播
Intent intent = new Intent();
intent.setAction("local");
localBroadcastManager.sendBroadcast(intent);
//注册广播接收器
IntentFilter filter1 = new IntentFilter();
filter1.addAction("local");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, filter1);
//释放广播
localBroadcastManager.unregisterReceiver(localReceiver);