入门篇:8.组件3:BroadcastReceiver
Posted 安卓随笔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入门篇:8.组件3:BroadcastReceiver相关的知识,希望对你有一定的参考价值。
广播类似于activity和service,同样是android中的基本组件。作为开发者,只需要掌握广播接受者,不必去理解其底层的机制
1.Broadcast(广播)和BroadcastReceiver(广播接受者)
广播是一种广泛运用在应用程序之间传输信息的机制。而广播接受者是对发送出来的广播进行过滤接收并相应的一类组件,它用于接收来自系统和应用中的广播
用途:
开机完成系统会发出一条广播
网络状态发生改变时体统发出一条广播
电池电量改变时,系统发出一条广播。
2.广播接受者的生命周期
广播接受者的生命周期非常短,只有大概几秒钟,因此在BroadcastReceiver里不能做一些比较耗时的操作。如果用到了比较耗时的操作,应该通过发送给Intent给Service,由Service来完成。并且需要注意的是,不能使用子线程。
3.广播的种类
普通广播(Normal broadcasts):
所有监听该广播的广播接受者都可以接收和监听到该广播
特点:
(1)同级别接受先后是随机的(无序)。
(2)级别低的后收到广播。
(3)接收器不能阶段广播的继续传播也不能处理广播。
(4)同级别动态注册高于静态注册。
有序广播(Ordered broadcasts)
按照接受者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接受者可以篡改内容。
特点:
(1)同界别接受顺序是随机的。
(2)能截断广播的继续传播,高级别的广播接收者收到该广播后,可以决定把该广播是否截断。
(3)接受者能截断广播的继续传播,也能处理广播。
(4)同级别动态注册高于静态注册。
异步广播(黏滞性滞留广播)
不能将处理结果传给下一个接受者,无法终止广播。(这类广播不常用)
4.普通广播优先级详解:
(1)在布局中添加一个按钮,用于发送广播
(2)点击发送广播按钮,携带数据发送广播,发送广播的按钮中执行如下代码:
Intent intent = new Intent(); intent.putExtra("msg","这是一条普通广播"); intent.setAction("BC_ONE"); sendBroadcast(intent);
其中BC_ONE用于过滤器过滤到该广播,该字符串可自定义。
(2)新建一个类BroadcastReceiver1.java,继承BroadcastReceiver,实现方法onReceive()。
(3)新建一个类BroadcastReceiver2.java,继承BroadcastReceiver,实现方法onReceive()。
这里创建两个广播接受者的原因是为了比较他们两个的优先级。
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /** * Created by lzc on 16/6/21. */ public class BroadcastReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String str = intent.getStringExtra("msg"); System.out.println("receiver1收到消息"+str); } }
BroadcastReceiver2.java同理,只不过输出的是 receiver2收到消息 。
(4)在AndroidManifest.xml中注册广播接受者。
<receiver android:name=".BroadcastReceiver1"> <intent-filter android:priority="100" > <action android:name="BC_ONE"/> </intent-filter> </receiver> <receiver android:name=".BroadcastReceiver2"> <intent-filter android:priority="200"> <action android:name="BC_ONE"/> </intent-filter> </receiver>
如果filter里面不加priority属性的话,两个广播接受器应当同时接收到广播。也就是同级别接收顺序为无序。而加上priority属性,则是自定义接受器的级别,数字越大,级别越高,越先收到广播。
另外,在AndroidManifest.xml中注册广播接受器属于静态注册,范围为全局。
(5)运行以上代码,得到的结果是:
06-21 13:56:01.452 10108-10108/com.example.lzc.broadcast I/System.out: receiver2收到消息这是一条普通广播
06-21 13:56:01.462 10108-10108/com.example.lzc.broadcast I/System.out: receiver1收到消息这是一条普通广播
由结果可见,receiver2比receiver1先接收到广播。
这就是普通广播的优先级体现
另外,如果在receiver2中添加截断广播的方法。abortBroadcast(),并不会截断广播。因为普通广播不允许被截断。
(6)上面介绍了静态注册接收器,这里简单提一下动态注册,所谓动态注册,也就是在java代码中注册,有效范围是当前运行的程序。
IntentFilter intentfilter = new IntentFilter("BC_ONE");//该字符串为Action BroadcastReceiver1 bc1 = new BroadcastReceiver1(); registerReceiver(bc1,intentfilter);
5.有序广播优先级与特点:
发送有序广播的方法是sendOrderedBrocast()
其他操作和优先级与普通广播类似,但是我们会发现,有序广播既可以截断广播,也可以处理广播的数据,即在BroadcastReceiver2里面可以处理BroadcastReceiver1所发送的数据。(普通广播不可以处理)
6.异步广播(黏滞性滞留广播)简介
(1)与其他两种广播形式不同的是,异步广播可以先发送广播在注册接收器。
(2)发送方法是:sendStickyBroadcast(intent)
(3)使用异步广播时需要一个用户权限
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
以上是关于入门篇:8.组件3:BroadcastReceiver的主要内容,如果未能解决你的问题,请参考以下文章