入门篇: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的主要内容,如果未能解决你的问题,请参考以下文章

Vue学习笔记入门篇——组件的使用

Vue学习笔记入门篇——组件的通讯

eclipse从入门到精通 高清珍藏版

OpenStack入门之核心组件梳理——Glance篇

React.js 新手快速入门 - 进阶篇

接口自动化测试,完整入门篇