《Android开发进阶:从小工到专家》——第1章,第1.3节Broadcast(广播)

1.3 Broadcast(广播)
Broadcast是一种广泛运用的、在应用程序之间传输信息的机制,Android中的广播与传统意义上的电台广播类似,一个广播可以有任意个接收者。广播机制是一个典型的发布—订阅模式,也就是我们所说的观察者模式。广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合。

Android广播机制包含 3 个基本要素,分别是用于发送广播的Broadcast、接收广播的BroadcastReceiver以及用于传递信息的Intent。Android广播可分为普通广播、有序广播、本地广播和Sticky广播。

1.3.1 普通广播
普通广播是完全异步的,通过Context的sendBroadcast()函数来发送,消息传递的效率比较高,但所有的receivers(接收器)的执行顺序不确定。缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播,直到没有与之匹配的广播接收器为止。

首先我们需要定义一个广播接收器,示例如下:

public class HelloBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "hello", Toast.LENGTH_LONG).show();
    }
}

第二步是注册广播,形式与Activity、Service的注册类似,可以通过AndroidManifest.xml或者代码进行注册,分别是静态注册和动态注册。xml注册示例如下:

<receiver android:name=".broadcast.HelloBroadcastReceiver" >
  <intent-filter>
         <action android:name="hello"/>
  </intent-filter>
</receiver>
动态注册的示例代码为:

private void registerHelloBroadcast() {
        registerReceiver(new HelloBroadcastReceiver(),
                  new IntentFilter(HELLO_ACTON)) ;
}
如果是在Activity或者Fragment中动态测试,那么不要忘了在执行onDestory时注销该广播。注册之后就可以发送广播了,代码如下所示:

private void sendNormalBroadcast() {
    sendBroadcast(new Intent(HELLO_ACTON));
}

然后就会调用HelloBroadcastReceiver的onReceive函数,在该函数中执行相关操作即可。

1.3.2 有序广播
有序广播通过Context.sendOrderedBroadcast()来发送,所有的广播接收器按照优先级依次执行,广播接收器的优先级通过receiver的intent-filter中的android:priority属性来设置,数值越大优先级越高。当广播接收器接收到广播后,可以使用setResult()函数来结果传给下一个广播接收器接,然后通过getResult()函数来取得上个广播接收器接返回的结果,并可以用abortBroadcast()函数来让系统丢弃该广播,使该广播不再传送到别的广播接收器接。

设置广播的优先级示例:

<receiver android:name=".broadcast.HelloBroadcastReceiver" >
   <intent-filter android:priority="100">
           <action android:name="hello"/>
   </intent-filter>
</receiver>
发送有序广播:

private void sendOrderBroadcast() {
    sendOrderedBroadcast(new Intent(HELLO_ACTON), null);
}

1.3.3 本地广播
在21版的Support v4包中新增本地广播,也就是LocalBroadcastManager。之前广播都是全局的,所有应用程序都可以接收到,这样就会带来安全隐患。但是,有的时候我们并不需要把自己应用内的信息广播给所有应用,而只是进程内使用,现在使用Support v4包中的LocalBroadcastManager就能够实现限于应用内的广播。

它的用法很简单,只需要把调用context的sendBroadcast、registerReceiver 、unregisterReceiver 的地方替换为LocalBroadcastManager getInstance (Context context)中对应的函数即可,如图1-1所示。

本地广播与普通广播只是操作的类不一样,其他的接口基本上都类似,因此,替换为本地广播的成本相对较低。为了程序的安全性,建议在不需要其他进程接收广播的情况下使用本地广播。

1.3.4 sticky广播
sticky广播通过Context.sendStickyBroadcast()函数来发送,用此函数发送的广播会一直滞留,当有匹配此广播的广播接收器被注册后,该广播接收器就会收到此条广播。使用此函数发送广播时,需要获得BROADCAST_STICKY权限:

<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

sendStickyBroadcast只保留最后一条广播,并且一直保留下去,这样即使已经有广播接收器处理了该广播,当再有匹配的广播接收器被注册时,此广播仍会被接收。如果你只想处理一遍该广播,可以通过removeStickyBroadcast()函数实现。

时间: 2024-07-31 08:25:34

《Android开发进阶:从小工到专家》——第1章,第1.3节Broadcast(广播)的相关文章

《Android开发进阶:从小工到专家》——第1章,第1.1节Activity

第1章 Android的构成基石-四大组件 Android开发进阶:从小工到专家 由于本书的目标读者是有一定Android基础的开发人员,因此,本章不再介绍Android系统的架构.历史等知识,而是直接切入主题,从讲解Android的四大组件开始,然后一步一步深入学习开发中的重要知识点,使得我们能够从基本原理层面掌握Android开发基础知识. Android中最重要的是四大组件,即Activity.Service.ContentProvider和Broadcast.这4个组件分工明确,共同构成

《Android开发进阶:从小工到专家》——第2章,第2.1节重要的View控件

第2章 创造出丰富多彩的UI-View与动画Android开发进阶:从小工到专家在第一章中,我们说到Android的用户界面构成,实际上就是Activity由一个搭载着视图树的Window构成.作为与用户直接交互的元素,UI控件变得尤为重要.本章将介绍部分常用且重要的控件.自定义控件.动画等内容,使我们进一步认识View,进入更丰富多彩的视图世界. 2.1 重要的View控件通常来说用户界面都是由Activity组成,Activity中关联了一个PhoneWindow创建,在这个窗口下则管理了一

Android开发进阶自定义控件之滑动开关实现方法【附demo源码下载】_Android

本文实例讲述了Android开发进阶自定义控件之滑动开关实现方法.分享给大家供大家参考,具体如下: 自定义开关控件 Android自定义控件一般有三种方式 1.继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑. 2.继承ViewGroup,这类自定义控件是可以往自己的布局里面添加其他的子控件的. 3.继承View,这类自定义控件没有跟原生的控件有太多的相似的地方,也不需要在自己的肚子里添加其他的子控件. ToggleView自定义开关控件表征上没有跟Androi

《Android开发进阶:从小工到专家》——导读

目 录前 言 第1章 Android的构成基石-四大组件1.1节Activity1.2节Service与AIDL1.3节Broadcast(广播)1.4节ContentProvider(外共享数据)1.5节小结第2章 创造出丰富多彩的UI-View与动画2.1节重要的View控件2.2节必须掌握的最重要的技能--自定义控件2.3节Scroller的使用2.4节让应用更精彩--动画2.5节小结 第3章 保证App流畅的关键因素-多线程第4章 HTTP网络请求第5章 独特高效的数据存储-SQLite

《Android开发进阶:从小工到专家》——第2章,第2.5节小结

2.5 小结本章学习了Android开发中最为重要的两个知识点,即自定义View与动画.通过自定义View,可以创造出丰富多彩的UI元素,但是由于篇幅有限,一些很重要的知识点并没有覆盖,例如Xfermode,在做一些特殊效果时灵活运用Xfermode将获得意想不到的效果.而对于Canvas以及Paint的细节也没有过多介绍.对于动画而言,我们了解了帧动画.补间动画.属性动画,而较新的VectorDrawable以及SVG等内容并没有覆盖,这些内容大家可以在学习完本章之后自行扩展.

Android开发进阶:如何读写Android文件

Android主要有四大主要组件组成:Activity.ContentProvider.Service.Intent组成.Android文件的运行主要需要读写四大组件的文件.本文将介绍如何读写Android文件,希望对正在进行Android开发的朋友有所帮助. 文件存放位置 在Android中文件的I/O是存放在/data/data/<package name>/file/filename目录下. 提示:Android是基于linux系统的,在linux的文件系统中不存在类似于Windows的

《Android开发进阶:从小工到专家》——第2章,第2.2节必须掌握的最重要的技能——自定义控件

2.2 必须掌握的最重要的技能--自定义控件 虽然Android已经自带了很多强大的UI控件,但是依旧不能满足所有开发人员的需求.通常开发人员需要实现设计师精心设计的视觉效果,这种情况下可能现有的控件就不能满足需求或者说使用现有的控件实现起来成本很高,此时我们只能寻找是否有类似的开源库,如果没有人实现过类似的效果,我们只能通过自定义View实现.因此,自定义View就成了开发人员必须掌握的最重要技能之一. 自定义View也有几种实现类型,分别为继承自View完全自定义.继承自现有控件(如Imag

《Android开发进阶:从小工到专家》——第2章,第2.4节让应用更精彩——动画

2.4 让应用更精彩--动画 为了使用户的交互更为流畅.自然,动画已经成为一款应用中不可缺少的部分.在Android中,动画的分类较多,有最早的帧动画.补间动画,从Android 3.0之后添加了属性动画,而在Android 5.0中又增加了VectorDrawable,使得Android的动画多种多样,能够满足用户的各种需求. 动画实际上就是在指定的时间段内持续地修改某个属性的值,使得该值在指定取值范围之内平滑的过渡.如图2-22所示是一个执行时长为40毫秒.将x从0平滑过渡为40的动画. 从

《Android开发进阶:从小工到专家》——第1章,第1.2节Service与AIDL

1.2 Service与AIDLService是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务.但不要被"后台"二字所迷惑,Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作. Service的运行不依赖于任何用户界面,即使程序被切换到后台或者用户打开了另外一个应用程序,Service仍然

《Android开发进阶:从小工到专家》——第2章,第2.3节Scroller的使用

2.3 Scroller的使用 为了更好地理解下拉刷新的实现,我们先要了解Scroller的作用以及如何使用.这里我们将做一个简单的示例来说明. Scroller是一个帮助View滚动的辅助类,在使用它之前,用户需要通过startScroll来设置滚动的参数,即起始点坐标和(x,y)轴上要滚动的距离.Scroller它封装了滚动时间.要滚动的目标x轴和y轴,以及在每个时间内View应该滚动到的(x,y)轴的坐标点,这样用户就可以在有效的滚动周期内通过Scroller的getCurX()和getC