Android有四大组件,分别为:Activity(活动)、Service(服务)、Content Provider(内容提供器)、Broadcast Receiver(广播接收者)。

引入广播的目的是便于接收和发送系统级(而不只是应用内部)的通知,使得Android的任意一个应用可以接收来自于系统和其他应用的消息。其机制类似于设计模式中的观察者模式(或发布-订阅模式)

广播的Android官方文档:Broadcasts

全局广播

因为下面还会介绍一种本地广播,因此将这部分称为全局广播。“全局”体现在所有应用都可以接收到广播,只要这些应用有注册接收者。

两种广播类型

  • 标准广播

    标准广播是我们通常意义上所理解的广播,即一旦发送广播,在广播范围内的接收者都能同时收到广播。

  • 有序广播

    “有序”指的是接收者排队按顺序接收广播,就像传纸条游戏一样。这种类型非常重要的一点是先接收广播的接收者可以决定是否将广播继续传递下去。

广播的发送者

  • Android系统

    系统广播包括但不限于:网络状态(7.0系统不推荐使用广播来接收)、开关机状态、电量状态。

  • 某个应用

    通常是自定义的广播

广播接收者

广播接收者必须继承BroadcastReceiver这个类。BroadcastReceiver是一个抽象类,它做了很多实现,但留下一个抽象方法给程序员去实现。

public abstract void onReceive(Context context, Intent intent);

继承BroadcastReceiver之后只需实现这个方法。在里面写上接收到所期望的广播时的处理代码就行了。需要注意的是,不能在这里面做耗时的处理。一旦超过10秒还没return,程序就会报错。如果想做耗时处理,可以开启后台服务。

在onReceive里开启线程之前需要执行goAsync()获取PendingResult,以此告诉系统当onReceive()执行结束之后,需要一些时间来完成线程的任务。在线程里面需要调用PendingResult的finish()来告诉系统线程已经完成任务。

两种广播接收者注册方式

在广播接收者的代码中没有声明响应哪些广播,因此需要在其他地方注册。

  • 代码中基于Context的动态注册

    由于Context有Activity级和Application级的,因此这两种方式的广播有效时期不一样。Activity级的广播接收者会在Activity的onDestroy()执行之后变为无效,而Application级的广播接收者只要APP还在运行,它就有效。

    当使用Context的广播接收者时,需要调用registerReceiver(BroadcastReceiver, IntentFilter) 和 unregisterReceiver(BroadcastReceiver)来注册和注销。这两个方法都在Context类里面。如果想注册Application级别的,就需要getApplicationContext()。在注册时传入IntentFilter用于指定期望接收的广播。

  • AndroidManifest.xml的静态注册

    Android系统的包管理器(package manager)会在APP安装到手机的时候注册写在这里的广播接收者。一旦注册,这个广播接收者成为指向该APP的一个独立个体。这样就意味着即使APP没有在运行,这个广播仍然可以正常运作。

    广播接收者需要写在application标签内,它的标签是receiver,需要指定name和intent-filter。举个例子:

    <application ...>
    ... <receiver android:name=".MyBroadcastReceiver"
    android:exported="true">
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
    </receiver> </application>

选择哪种注册方式主要看需求。如果想要在程序没有启动的情况下就响应广播,那么就采用静态注册;如果只想在程序启动的情况下接收广播,就用动态注册。

无论是用哪种方式注册广播,其广播接收器的写法都是一样的。

自定义广播

自定义广播的关键是Action的定义。

Intent intent = new Intent("com.example.yourappname.YOUR_BROADCAST_NAME");
sendBroadcast(intent);

需要注意的是,自定义的Intent Action是一个字符串,这个字符串你可以按照以上的格式写。

在写接收者的Action时,把上面定义的字符串作为Action复制过去就行了。

发送有序广播

sendBroadcast(intent); 改为 sendOrderedBroadcast(intent, null) 就行了。第二个参数是权限相关的字符串,如果没有权限要求,就填null。

  • 如何决定广播的顺序?

    intent filter有一个priority的参数,设置得越高就越先接收。

  • 如何截断广播?

    在BroadcastReceiver的onReceive中调用abortBroadcast()就行了。如果你想在某种情况下截断广播,则需要判断语句。

  • 前面的接收者和后面的接收者之间沟通

    通过在onReceive()中执行setResultData()来设置给后面接收者的内容,执行getResultData()来获取前面接收者设置的内容。

本地广播

某些广播的目的地是应用内部,它们可能含有关键性的数据。为了防止这些广播被其他程序获取,引入了LocalBroadcastManager(本地广播)。

本地广播和全局广播的不同之处主要有以下几点:

  • 不能在AndroidManifest.xml里注册receiver
  • 需要获取LocalBroadcastManager实例
  • 发送广播时要用LocalBroadcastManager实例调用sendBroadcast(Intent intent)

广播接收者的写法是一样的。

Android笔记(五):广播接收者(Broadcast Receiver)的更多相关文章

  1. Android学习笔记_19_广播接收者 BroadcastReceiver及其应用_窃听短信_拦截外拨电话

    一.广播接收者类型: 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”. 普通广播是完全异步的,可以在同一时刻(逻辑上 ...

  2. Android学习笔记八:用Broadcast Receiver跨进程(跨app)通信

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7515194.html 在前面介绍四大组件的时候提到了可以对外部事件进行过滤的Broadcast Receive ...

  3. Android之旅---广播(BroadCast)

    什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们 ...

  4. <Android基础> (五) 广播机制

    1)接收系统广播:a.动态注册监听网络变化 b.静态注册实现开机启动 2)发送自定义广播:a.发送标准广播 b.发送有序广播 3)使用本地广播 第五章 5.1 广播机制 Android中的每个程序都可 ...

  5. Android笔记之广播

    为了容易理解,可以将广播代入到事件模型中,发送广播消息看做是触发event,BroadcastReceiver是处理事件的回调逻辑. 广播这种模型中涉及到两个角色,就是广播的发送者和接收者,所以会涉及 ...

  6. Android面试收集录2 Broadcast Receiver详解

    1.Broadcast Receiver广播接收器简单介绍 1.1.定义 Broadcast Receiver(广播接收器),属于Android四大组件之一 在Android开发中,Broadcast ...

  7. Android开发学习之路--Broadcast Receiver之初体验

    学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyB ...

  8. [android] 代码注册广播接收者&利用广播调用服务的方法

    利用广播调用服务里面的方法,间接的方式调用服务内部的方法,与现实中差不多,请媒体曝光 主界面里面 在界面创建的时候开启一下服务普通的startService()方法 发送一条广播出去 获取Intent ...

  9. 【Android 初学】13、Broadcast Receiver

    Broadcast Receiver Android广播机制包括三个基本要素:广播(Broadcast) - 用于发送广播.广播接收器(BroadcastReceiver) - 用于接收广播:意图内容 ...

  10. android基础(二)Broadcast Receiver知识

    1.广播的注册 (1)动态广播注册: 优点:可以灵活控制广播的注册与撤销 缺点:必须在程序启动时才能接收广播 IntentFilter :当Intent在组建之间传递时,组件想告诉android系统自 ...

随机推荐

  1. Windows2008 r2 x64下安装FTP工具File Zilla server报错:could not load tls libraries filezilla

    安装file zilla server的时候报错: could not load tls libraries filezilla 搜索了下发现是新版本有这个问题,降低到0.9.43就没这个问题了

  2. 注解图Annotation

    该图来源于 竹子-博客(.NET/Java/Linux/架构/管理/敏捷) http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html,感 ...

  3. table下tbody滚动条与thead对齐的方法且每一列可以不均等

    1 前言 table下tbody滚动条与thead对齐的方法,开始在tbody的td和thead的tr>td,对每一个Item加入百分比,结果是没对齐.也尝试了用bootstrap的col-md ...

  4. Python-HTML 最强标签分类

    编程: 使用(展示)数据 存储数据 处理数据 前端 1. 前端是做什么的? 2. 我们为什么要学前端? 3. 前端都有哪些内容? 1. HTML 2. CSS 3. JavaScript 4.jQue ...

  5. npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted,)解决方法

    npm ERR! path E:\SouthernPowerGridProject\web_project\AutoOPS\autoops\node_modules\fsevents\node_mod ...

  6. 将eclipse的maven项目导入到intellij idea中

    最近项目中需要用到idea,需要将原来的eclipse项目进行转移.捣鼓了半天终于成功了,在这里和大家分享下,希望对大家有所帮助,如有错误,欢迎指正. idea的确是一款很智能的开发工具,真的是爱不释 ...

  7. python 全栈开发,Day131(向app推送消息,玩具端消息推送)

    先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.4.zip 注意:由于涉及到 ...

  8. 通过生成支付二维码来实现微信支付的解决方案 - EasyWechat版(转)

    上一篇我们讲了在微信浏览器内实现微信支付的功能,它特别适合于一些基于微信公众号的h5站点等,支付流程也相当流畅,但是... 还有一种情况,比如现在北哥兄弟连PC版,是生成了一个二维码,这个二维码是专属 ...

  9. JAVA开发工程师面试(1)

    我已经有很长一段时间没有更新博客了,难道是博主我变懒惰了吗?哎,这样可不行啊,我还有好多知识要学习,要和大家分享.以后我需要更加努力,改掉自己的惰性.本人文采不怎么样,只能是把自己所想的说出来,想和大 ...

  10. BZOJ1965 [Ahoi2005]SHUFFLE 洗牌 快速幂

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1965 题意概括 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取 ...