Broadcast(广播)是Android四大组件之一,正如其名,就像一个广播喇叭一样,起着进程间,或进程内部传递消息的作用。
BroadcastReceiver(广播接收器)有两种生成方式,静态注册和动态注册,静态注册就是在xml中注册,动态注册就是在activity中注册,
BroadcastReceiver有两种范围,一种是进程间,如android很多内置的系统级广播,可以在系统的各个位置任意时段接受,另一种是本地广播,只能作用于某一个应用程序内部,一般我们用这种即可,以免导致一些不必要的凌乱。
BroadcastReceiver有两个类别,一个标准广播,速度快,所有接收器几乎同时接收而没有顺序。另一种是有序广播,可以有序的接收,并拦截。
下面我们分类探讨一下。
在接收广播前,很显然要先生成一条广播:
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(“android.net.conn.CONNECTIVITY_CHANGE”);
registerReceiver(mReceiver,mIntent);
这里新建了一个IntentFilter,addAction接收的参数就是具体要监听的广播,紧接着注册这个接收器。
在这个Activity的onDestroy()方法中:
unregisterReceiver(mReceiver);
销毁接收器
在这里新建一个类并继承BroadcastReceiver(广播接收器),并重写onReceiver()方法
classNetworkChangeReceiverextendsBroadcastReceiver{
@Override
public voidonReceive(Context context,Intent intent) {
Toast.makeText(context,"network
changes",Toast.LENGTH_SHORT).show();
}
}
这里在activity中写了一个内部类,继承BroadcastReceiver,在onReceive()方法中写具体逻辑,这里只打印一个吐司。
注意,这里实际上就是一个动态的在activity中注册一个广播接收器。
静态注册。
动态注册很显然只有你程序启动以后才能使用,因为注册是写在onCreate()中的,静态注册就可以各个时段使用。
首先,和动态注册差不多的一件事,就是新建一个类,继承BroadcastReceiver并重写onReceiver()方法。
public classBootCompleteReceiverextendsBroadcastReceiver {
public voidonReceive(Context context,Intent intent){
Toast.makeText(context,"BootComplete",Toast.LENGTH_SHORT).show();
}
}
这是一个监听开机启动的一个广播接收器,我们在AndroidManifest.xml文件中,声明一个监听开机启动的intentFilter
在标签内写入:
这实际上就是,xml版的IntentFilter
接着,action这里的值是"android.intent.action.BOOT_COMPLETED",这里监听了系统开机,这种系统级信息的监听或服务都是需要声明权限的,所以,在最开始我们就写入:
自定义广播
关键在于监听的action的值,两边不写错即可,其他的都差不多
有序广播
之前写的都是标准广播,是没有接收顺序,也不能拦截的,有序广播与此不同。
发送有序广播和标准广播的操作大体不差,首先要有广播,这里就直接定义一个接收器,然后在AndroidMainfest.xml中注册一个自定义广播:
public classAnotherBroadcastReceiverextendsBroadcastReceiver {
@Override
public voidonReceive(Context context,Intent intent) {
Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
>
然后再某一个activity中:
IntentmIntent =newIntent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(mIntent, null);
可见,唯一的区别就是调用的时候,方法变了,还有注册的时候多了一个android:priority
属性,这个属性的值越大,优先级越高,越先收到广播
abortBroadcast();
方法用来拦截广播,禁止继续传递。
本地广播
以上,都是全局广播,也就是说所有的程序都有可能受到,自然是有很大隐患的。所以一般我们用本地广播
本地广播的初始化方式也很想,无非就是类不一样:
privateIntentFilterintentFilter;
privateLocalBroadcastManagermanager; //管理本地广播
LocalBroadcastReceiver localBroadcastReceiver =newLocalBroadcastReceiver();
manager= LocalBroadcastManager.getInstance(this);//获取实例
manager.sendBroadcast(mIntent);
intentFilter=newIntentFilter();
intentFilter.addAction(" ...... ");
manager.registerReceiver(localBroadcastReceiver,intentFilter);
在onCreate()方法中,首先new一个IntentFilter,receiver,然后拿到manager的实例,调用localBroadcastReceiver.registerReceiver()注册,这样,就是注册了一个本地广播接收器,不要忘了在onDestroy()中释放就好。