相信我们对广播并不陌生,作为Android四大主键之一,一定有其非常重要的作用。这篇Blog就记录一些广播中常用的方法,步骤。
关键点:
OK,按照关键点,一个个来看。
一、广播的类型
标准广播
完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。
有序广播
同步执行的广播,我们可以控制广播在哪里中断
二、下面就来看下广播的监听
动态注册广播监听
MainActivity中,通过如下代码,就可以动态注册一个广播监听,代码中intentFilter中的action是监听网络连接状态的
IntentFilter mIntentFilter=new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");//网络监听的action
NetWorkBroadcast mNetWorkBroadcast=new NetWorkBroadcast();
registerReceiver(mNetWorkBroadcast,mIntentFilter);
NetWorkBroadcast是我们自定义的一个广播监听者
public class NetWorkBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=manager.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();
}
}
}
OK,上面是动态注册广播监听者,下面看如何静态注册
<!--静态注册BootCompleteReceive,监听开机启动-->
<receiver android:name=".broadcast.BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
上面的广播是我们定义的另外一个广播监听器,其作用是监听开机启动,即在开机后会执行我们BootCompleteReceiver中的onReceiver方法
public class ReceiveBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
三、发送广播
通过如下代码我们就可以成功发送一个广播,只要我们按照上面的方法,动态或者静态的注册一个广播,该广播的action匹配下面的intent中的action,就可以成功监听下面发出的这个广播
Intent intent = new Intent("com.wj.broadcast.ReceiveBroadcast");
sendBroadcast(intent);
四、接下来简单看一下有序广播的使用
我们直接说跟上面的不同,首先发送广播的时候是通过
sendOrderedBroadcast(intent,null);
发送,并不是上面的sendBroadcast
其次,在静态注册的广播的时候,我们给起设置优先级,那么发出上面的有序广播后,下面广播接受者会优先接收到这个广播
<receiver android:name=".broadcast.ReceiveBroadcast">
<!--android:priority广播执行的优先级-->
<intent-filter android:priority="100">
<action android:name="com.wj.broadcast.ReceiveBroadcast"/>
</intent-filter>
</receiver>
我们可以在优先接受到的广播中中断该广播的传递,这样有序广播就不会在继续传递下去
public class ReceiveBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
//截断广播,不允许广播继续传播
abortBroadcast();
}
}
四、看一下关键的本地广播
我们当然不希望我们应用程序中发出的广播被别人轻易的接受,那么我们使用本地广播,其他应用程序就不会接受到我们发出的广播,这样就保证了我们广播数据传递的安全
看如何实现:
我们需要一个系统自带的LocalBroadcastManager 类来管理我们的广播
private LocalBroadcastManager localBroadcastManager;
发送广播的时候:
Intent intent = new Intent("com.wj.broadcast.ReceiveBroadcast");
localBroadcastManager.sendBroadcast(intent);
接收广播的时候
//动态注册
mIntentFilter=new IntentFilter("com.wj.broadcast.ReceiveBroadcast");
receiveBroadcast=new ReceiveBroadcast();
localBroadcastManager.registerReceiver(receiveBroadcast,mIntentFilter);
ok,这样我们就实现了本地广播的发送和接收!
ps:上面用到网络、开机启动的监听,都需要加入系统权限
<!--监听网络状态权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--监听开机启动权限-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
ps:在动态注册广播的时候,不要忘记在活动结束的时候取消广播的注册
@Override
protected void onDestroy() {
super.onDestroy();
//动态注册的广播要取消注册
unregisterReceiver(mNetWorkBroadcast);
}
本地广播类似,也要取消注册.
欢迎大家留言讨论,指教!!!