入门篇: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"/>
时间: 2024-11-06 12:36:39

入门篇:8.组件3:BroadcastReceiver的相关文章

【Android的从零单排开发日记】之入门篇(十二)——Android组件间的数据传输

组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制数据. 一.Intent数据传递 那么首先是简单的跳转.我们可以借助bundle这个容器来存放我们想要传递的数据. Intent intent = new Intent(); intent.setClass(activity1.this, activity2.class); //描述起点和目标 Bu

【Android的从零单排开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都可以通过广播来通知用户.要做比喻的话,广播就像是我们的感官,能够有效且快速的从外界获取信息来反馈给自身. 一.广播的功能和特征 广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码

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

本文为转载,原文:Vue学习笔记入门篇--组件的使用 组件定义 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 组件使用 注册 注册一个全局组件,你可以使用 Vue.component(tagName, options).组件在注册之后,便可以在父实例的模块中以自定义元素 的形式使用.

Vue学习笔记入门篇——组件的内容分发(slot)

本文为转载,原文:Vue学习笔记入门篇--组件的内容分发(slot) 介绍 为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 "transclusion" 如果你熟悉 Angular).Vue.js 实现了一个内容分发 API,使用特殊的 'slot' 元素作为原始内容的插槽. 编译作用域 在深入内容分发 API 之前,我们先明确内容在哪个作用域里编译.假定模板为: <child-component> {{ messa

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

本文为转载,原文:Vue学习笔记入门篇--组件的通讯 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B.它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件.然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的.这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅提高了组件的可维护性和可重用性.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props 向下传递

【Android的从零单排开发日记】之入门篇(四)——Android四大组件之Activity

在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页面类似.当然,这种相似性主要体现在设计思想上.在具体实现方面,Android的Activity组件有自己的设计规范,同时,它能够更简便地使用线程.文件数据等本地资源. 一.Activity 的生命周期 Activity 的生命周期是被以下的函数控制的. 1 public class Activity

【Android的从零单排开发日记】之入门篇(五)——Android四大组件之Service

这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的级别差不多,但不能自己运行只能后台运行.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等, 总之服务总是藏在后台的. ps:Service运行在主线程中的,所

【Unity】常用脚本类的继承关系(入门篇)

前言 学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略. 本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://blog.csdn.net/duzixi Unity常用脚本类继承关系图 对Unity开发稍有了解的朋友都知道,在Unity开发框架中有4个基本层次:工程(应用程序).场景.游戏对象和组件. 在脚本中,整个应用程序和场景由Application类控制:而游戏对象和组件类均继承于Object类. 在Object

Linux及Arm-Linux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一.Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二.Linux开发平台搭建... 5 2.1安装虚拟工作站... 5 2.2安装Linux虚拟

storm学习之入门篇(一)

海量数据处理使用的大多是鼎鼎大名的hadoop或者hive,作为一个批处理系统,hadoop以其吞吐量大.自动容错等优点,在海量数据处理上得到了广泛的使用.但是,hadoop不擅长实时计算,因为它天然就是为批处理而生的,这也是业界一致的共识.否则最近这两年也不会有s4,storm,puma这些实时计算系统如雨后春笋般冒出来.先抛开s4,storm,puma这些系统不谈,我们首先来看一下,如果让我们自己设计一个实时计算系统,我们要解决哪些问题: 1.低延迟.都说了是实时计算系统了,延迟是一定要低的