1. 什么是广播
BroadcastReceiver是android四大组件之一,四大组件一般是需要在Manifest.xml清单文件注册,但广播可以在代码中动态注册。
每一个应用都可以注册去接收系统或者其他应用发出的广播,自己也可以发送广播。例如系统开机就会发送
android.intent.action.BOOT_COMPLETED,我们可以接受广播,作为触发器。
2. 广播的分类
一般广播在发送的时候,总是被接收者同时接受。但是有序广播就按接收者的优先级来传递。
1. 发送标准(异步无序)广播
Intent intent=new Intent("自定义字符串");
sendBroadCast(intent);
2. 发送有序广播
Intent intent=new Intent("自定义字符串");
sendOrderBroadcast(intent,null//权限相关字符串)
在manifest注册的receiver里 android:priority="100" 属性可以设置优先级
在广播接受者类中的onReceive方法中abordBroadcast();可以中断广播,不会再继续传递。
3. 静态注册和动态注册接受系统广播
1. 动态注册接收网络广播
public class MyNetworkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if ( info != null && info.isAvailable()){
//当前网络状态可用
int netType = info.getType();
if (netType == ConnectivityManager.TYPE_WIFI){
Log.e("NETSTATUE", "wifi");
}else if (netType == ConnectivityManager.TYPE_MOBILE ){
Log.e("NETSTATUE", "mobile");
}
}else {
//当前网络不可用
Log.e("NETSTATUE", "无网络连接");
}
}
}
MyNetworkReceiver receiver = new MyNetworkReceiver();
IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(receiver, intentFilter);
//在onDestroy中取消注册
unregisterReceiver(mReceiver);
2. 静态注册接收开机广播
加上用户权限RECEIVE_BOOT_COMPLETE
public class BootCompletedBroadcastReceiver extends BroadcastReceiver {
private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_BOOT.equals(intent.getAction())) {
Intent i = new Intent(context,SplashActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
<receiver
android:name=""
android:enable="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETE"/>
</intent-filter>
</receiver>
3. 使用本地广播发送自定义广播
本地广播的优点 高效,广播不会离开本应用,也不会接受外部的广播
Intent intent = new Intent("xxxxxxx");
LocalBroadCastManager lbm=LocalBroadCastManager.getInstance(this);
LocalReceiver localReceiver=new LocalReceier();
lbm.sendBroadcastReceiver(intent);
ibm.registerReceiver(localReceiver,intentFilter);
//在onDestroy中取消注册
ibm.unregisterReceiver(localReceiver);