Android广播接收器(BroadcastReceiver)

来源:互联网 发布:c语言primer plus pdf 编辑:程序博客网 时间:2024/04/28 02:28

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()方法

class NetworkChangeReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();    }}

这里在activity中写了一个内部类,继承BroadcastReceiver,在onReceive()方法中写具体逻辑,这里只打印一个吐司。

注意,这里实际上就是一个动态的在activity中注册一个广播接收器。

静态注册。
动态注册很显然只有你程序启动以后才能使用,因为注册是写在onCreate()中的,静态注册就可以各个时段使用。
首先,和动态注册差不多的一件事,就是新建一个类,继承BroadcastReceiver并重写onReceiver()方法。

public class BootCompleteReceiver extends BroadcastReceiver {    public void onReceive(Context context, Intent intent){        Toast.makeText(context, "BootComplete", Toast.LENGTH_SHORT).show();    }}

这是一个监听开机启动的一个广播接收器,我们在AndroidManifest.xml文件中,声明一个监听开机启动的intentFilter
在标签内写入

<receiver android:name=".BootCompleteReceiver">    <intent-filter>        <action android:name="android.intent.action.BOOT_COMPLETED"/>    </intent-filter></receiver>

这实际上就是,xml版的IntentFilter
接着,action这里的值是”android.intent.action.BOOT_COMPLETED”,这里监听了系统开机,这种系统级信息的监听或服务都是需要声明权限的,所以,在最开始我们就写入

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

自定义广播
关键在于监听的action的值,两边不写错即可,其他的都差不多

有序广播
之前写的都是标准广播,是没有接收顺序,也不能拦截的,有序广播与此不同。
发送有序广播和标准广播的操作大体不差,首先要有广播,这里就直接定义一个接收器,然后在AndroidMainfest.xml中注册一个自定义广播

public class AnotherBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "received in AnotherBroadcastReceiver", Toast.LENGTH_SHORT).show();    abortBroadcast();    }}<receiver android:name=".AnotherBroadcastReceiver">    <intent-filter android:priority="100">        <action android:name="com.example.broadcasttest.MY_BROADCAST"/>    </intent-filter></receiver>

然后再某一个activity中

Intent mIntent = new Intent("com.example.broadcasttest.MY_BROADCAST");sendOrderedBroadcast(mIntent, null);

可见,唯一的区别就是调用的时候,方法变了,还有注册的时候多了一个android:priority
属性,这个属性的值越大,优先级越高,越先收到广播

abortBroadcast();

方法用来拦截广播,禁止继续传递。

本地广播
以上,都是全局广播,也就是说所有的程序都有可能受到,自然是有很大隐患的。所以一般我们用本地广播
本地广播的初始化方式也很想,无非就是类不一样

private IntentFilter intentFilter;private LocalBroadcastManager manager; //管理本地广播LocalBroadcastReceiver localBroadcastReceiver = new LocalBroadcastReceiver();manager = LocalBroadcastManager.getInstance(this);//获取实例manager.sendBroadcast(mIntent);intentFilter = new IntentFilter();intentFilter.addAction(" ...... ");manager.registerReceiver(localBroadcastReceiver, intentFilter);

在onCreate()方法中,首先new一个IntentFilter,receiver,然后拿到manager的实例,调用localBroadcastReceiver.registerReceiver()注册,这样,就是注册了一个本地广播接收器,不要忘了在onDestroy()中释放就好。

原创粉丝点击