zoukankan      html  css  js  c++  java
  • 入门篇: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"/>
  • 相关阅读:
    全代码实现WordPress分类目录和标签添加新的自定义字段
    基于max-height实现不定高度元素的折叠/合并,展开/收缩的动画效果
    css实现不定宽高的图片img居中裁剪_类似微信朋友圈图片效果
    你知道我们平时在CSS中写的%都是相对于谁吗?
    纯css如何绘制三角形_利用border实现画三角形的原理方法
    wordpress建站不得不知的安全防护(二)
    wordpress建站不得不知的安全防护(一)
    Java连载55-接口的作用、接口举例
    Java连载54-两种单例模式、接口详解
    Python连载54-FTP编程
  • 原文地址:https://www.cnblogs.com/androidNot/p/5603614.html
Copyright © 2011-2022 走看看