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()中释放就好。
- Android 广播接收器(BroadcastReceiver)
- Android广播接收器(BroadcastReceiver)
- BroadCastReceiver android 广播接收器
- Android 广播接收器BroadcastReceiver
- android-----BroadcastReceiver广播接收器
- Android-BroadcastReceiver广播接收器
- BroadcastReceiver(广播接收器)
- Android基础-broadcastreceiver(广播接收器)
- Android BroadcastReceiver(广播接收器)基础
- android BroadcastReceiver(广播接收器)【转载】
- Android-(广播接收器)BroadcastReceiver-2
- Android BroadcastReceiver广播接收器详解
- Android 广播接收器BroadcastReceiver(一)
- Android 广播接收器BroadcastReceiver(二)
- Android 广播接收器BroadcastReceiver(三)
- Android 广播接收器BroadcastReceiver(四)
- Android 广播接收器BroadcastReceiver(五)
- Android 广播接收器BroadcastReceiver(六)
- Java虚拟机--字节码(二十一)
- Mongodb技术总结(version3.4.4)
- const和指针
- 定义一个变量a和b,不通过中间变量就可以交换值
- nfs
- Android广播接收器(BroadcastReceiver)
- mysql之 MySQL 主从基于position复制原理概述
- ZOJ--1006:Do the Untwist
- 实验四
- 创建ROS消息和ROS服务(九)
- hdu5980_Find Small A_思维
- javascript 判断时间控件中,结束时间不能大于开始时间
- jtree 部分监听
- 2.2 利用DFT计算线性卷积