Android BroadcastReceiver详解

合集下载

android开发 广播接收者 短信拦截 电话拦截 发送广播

android开发 广播接收者 短信拦截 电话拦截 发送广播

目录广播接收者(BroadcastReceiver) (1)什么是广播接收器 (1)广播接收者的特性 (1)广播的分类(优先级) (2)设置优先级别 (2)发送广播 (3)广播的中断:不再向下传递广播 (3)短信拦截器: (3)拨号拦截器: (4)广播接收者(BroadcastReceiver)什么是广播接收器广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。

很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。

应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

广播接收者的特性1.一个广播接收者只能接收一个广播,一个广播可以被多个广播接收者接收.2.广播接收者之间通过Intent的action来区分接收的是哪些广播.3.广播接收者BroadcastReceiver不需要显示调用启动,由系统调用.4.每次广播消息到来时都会创建BroadcastReceiver实例,然后调用onReceiver()方法,onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁.5.当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应,弹出ANR错误对话框.6.不要在广播接收者中创建子线程来执行耗时操作,不可靠.在广播接收者中不应该执行耗时的操作、如果有耗时操作需要创建服务、由服务来执行耗时操作.7. 如果在广播接收者或服务中启动Activity,需要对意图进行如下设置。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);为什么此处要进行使用一个新的任务栈?在系统调用广播的时候,有可能还没有执行Activity,不存在任务栈,所以要使用这个flag. 广播的分类(优先级)普通广播(Normal broadcasts):完全异步,可以同时被所有接收者接收到有序广播(Ordered broadcasts):按照接收者声明的优先级别,被接收者依次接收广播.普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别,被接收者依次接收广播。

Android BroadcastReceiver

Android BroadcastReceiver

BroadcastReceiver 用于异步接收广播Intent。

主要有两大类,用于接收广播的:∙正常广播 Normal broadcasts(用Context.sendBroadcast()发送)是完全异步的。

它们都运行在一个未定义的顺序,通常是在同一时间。

这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。

∙有序广播 Ordered broadcasts(用Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。

所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。

而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。

要注意的是,即使是Normal broadcasts,系统在某些情况下可能会恢复到一次传播给一个receiver。

特别是receiver可能需要创建一个进程,为了避免系统超载,只能一次运行一个receiver。

Broadcast Receiver 并没有提供可视化的界面来显示广播信息。

可以使用Notification和Notification Manager来实现可视化的信息的界面,显示广播信息的内容,图标及震动信息。

生命周期一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。

因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。

对于耗时的操作,请start service来完成。

因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。

BroadcastReceiver的用法

BroadcastReceiver的用法

BroadcastReceiver(广播接收器)是Android中的四大组件之一。

下面是Android Doc中关于BroadcastReceiver的概述:①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。

很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。

应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

②应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。

所有的接收器均继承自BroadcastReceiver基类。

③广播接收器没有用户界面。

然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。

通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。

一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

Android中的广播事件有两种,一种就是系统广播事件,比如:ACTION_BOOT_COMPLETED (系统启动完成后触发),ACTION_TIME_CHANGED(系统时间改变时触发),ACTION_BATTERY_LOW(电量低时触发)等等。

另外一种是我们自定义的广播事件。

广播事件的流程①注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。

两种方式都需要IntentFIlter。

②发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。

③接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。

BroadcastReceiver广播接收者

BroadcastReceiver广播接收者

广播接收者BroadcastReceiver已有 86 次阅读2011-5-16 22:34|个人分类:Android广播接收者:①是用来接收广播Intent的②一个广播Intent是可以被多个订阅了此广播的广播接收者所接收广播又可以分为“普通广播”和“有序广播”普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,优点效率比较高,缺点接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。

有序广播是按照接收者声明的优先级别,被接收者依次接收广播。

如:A的级别高于B,B 的级别高于C,那么,广播首先传给A,再传给B,最后传给C 。

优先级别在<intent-filter>的android:priority属性中声明,数值越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置。

有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。

另外,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。

广播Intent的发送是通过调用下面两个函数之一来实现的Context.sendBroadcast()发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。

对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。

broadcastreceiver 超过10s

broadcastreceiver 超过10s

broadcastreceiver 超过10s BroadcastReceiver是Android中一种重要的组件,用于接收系统广播和其他应用程序发送的广播消息。

然而,根据Android官方文档的要求,BroadcastReceiver的onReceive()方法应尽量避免执行耗时操作,以免引起ANR(Application Not Responding)错误。

在本文中,我将逐步解释为什么BroadcastReceiver的执行时间应该控制在10秒以内,并介绍处理长时间操作的方法。

首先,让我们来了解一下为什么BroadcastReceiver的执行时间应该被限制在10秒以内。

在Android系统中,BroadcastReceiver是在主线程中运行的,而主线程负责处理用户界面和用户交互。

如果BroadcastReceiver的执行时间过长,就会导致主线程阻塞,用户界面将无法响应用户的操作,从而使整个应用程序变得不可用。

为了避免这种情况的发生,Android系统设置了一个超时时间,即10秒。

那么,当我们的BroadcastReceiver需要执行一些耗时操作时该怎么办呢?Android提供了一种解决方案,即使用JobScheduler或者后台服务来处理耗时操作。

JobScheduler是Android 5.0引入的一个API,它可以用来处理一些需要较长时间才能完成的任务,而不会阻塞主线程。

与JobScheduler相比,后台服务是一个更早的解决方案,它允许应用程序在后台执行一些任务,而不会受到BroadcastReceiver超时限制的影响。

接下来,让我们详细介绍如何使用JobScheduler来处理BroadcastReceiver中的耗时操作。

首先,我们需要在AndroidManifest.xml文件中注册一个JobService组件,用于处理我们的耗时任务。

然后,在BroadcastReceiver的onReceive()方法中,我们可以使用JobScheduler来启动一个Job,以执行耗时操作。

Android中的广播(BroadCast)详细介绍

Android中的广播(BroadCast)详细介绍

Android中的⼴播(BroadCast)详细介绍什么是⼴播在Android中,Broadcast是⼀种⼴泛运⽤的在应⽤程序之间传输信息的机制。

我们拿⼴播电台来做个⽐⽅。

我们平常使⽤收⾳机收⾳是这样的:许许多多不同的⼴播电台通过特定的频率来发送他们的内容,⽽我们⽤户只需要将频率调成和⼴播电台的⼀样就可以收听他们的内容了。

Android中的⼴播机制就和这个差不多的道理。

电台发送的内容是语⾳,⽽在Android中我们要发送的⼴播内容是⼀个Intent。

这个Intent中可以携带我们要传送的数据。

电台通过⼤功率的发射器发送内容,⽽在Android中则是通过sendBroadcast这个⽅法来发送(很形象的名字吧)。

⽤户通过调整到具体的电台频率接受电台的内容。

⽽在Android中要接受⼴播中的内容则是通过注册⼀个BroadCastReceiver 来接收的。

只有发送⼴播的action和接收⼴播的action相同,接受者才能接受这个⼴播。

⼴播有什么⽤其实,在什么是⼴播的第⼀句就已经说明了⼴播有什么⽤了。

对了,笼统⼀点讲就是⽤来传输数据的。

具体⼀点说就是:1.实现了不同的程序之间的数据传输与共享,因为只要是和发送⼴播的action相同的接受者都能接受这个⼴播。

典型的应⽤就是android⾃带的短信,电话等等⼴播,只要我们实现了他们的action的⼴播,那么我们就能接收他们的数据了,以便做出⼀些处理。

⽐如说拦截系统短信,拦截骚扰电话等等 2.起到了⼀个通知的作⽤,⽐如在service中要通知主程序,更新主程序的UI等。

因为service是没有界⾯的,所以不能直接获得主程序中的控件,这样我们就只能在主程序中实现⼀个⼴播接受者专门⽤来接受service发过来的数据和通知了。

实现⼴播现在我们就来实现⼀个简单的⼴播程序。

Android提供了两种注册⼴播接受者的形式,分别是在程序中动态注册和在xml中指定。

他们之间的区别就是作⽤的范围不同,程序动态注册的接收者只在程序运⾏过程中有效,⽽在xml注册的接收者不管你的程序有没有启动有会起作⽤。

broadcastreceiver startactivity -回复

broadcastreceiver startactivity -回复

broadcastreceiver startactivity -回复BroadcastReceiver和startActivity之间的关系和使用方法引言:在Android开发中,BroadcastReceiver(广播接收器)和startActivity (启动活动)是两个重要的组件。

BroadcastReceiver用于接收和处理来自系统或应用程序发送的广播消息,而startActivity用于启动新的Activity。

本文将逐步介绍BroadcastReceiver和startActivity之间的关系及其使用方法。

一、BroadcastReceiver的概述BroadcastReceiver是一个全局的组件,用于接收和处理来自系统或应用程序发送的广播消息。

它能够在后台运行,监听指定的广播事件,并根据接收到的广播消息执行相应的操作。

例如,当手机接收到短信时,系统会发送一个SMS_RECEIVED的广播消息,我们可以通过注册一个BroadcastReceiver来接收并处理该消息。

二、startActivity的概述startActivity用于启动一个新的Activity。

它可以用于从一个Activity跳转到另一个Activity,实现页面之间的切换和交互。

通过startActivity,我们可以传递额外的数据给新启动的Activity,从而在不同的Activity之间传递和共享数据。

三、BroadcastReceiver和startActivity的关系1. BroadcastReciever的触发条件首先,BroadcastReceiver可以在系统或应用程序发送广播消息时被触发。

可以通过注册一个BroadcastReceiver来监听指定的广播事件,只有当该事件发生时,BroadcastReceiver才能收到相应的广播消息并执行相应的操作。

2. BroadcastReceiver启动Activity在BroadcastReceiver的onReceive()方法中,我们可以使用startActivity 方法来启动一个新的Activity。

broadcastreceiver startactivity -回复

broadcastreceiver startactivity -回复

broadcastreceiver startactivity -回复「BroadcastReceiver.startActivity」:激活Activity的广播接收器引言:在移动应用开发中,我们经常会遇到需要在不同组件之间进行通信的情况。

广播接收器(BroadcastReceiver)是Android平台中一种很常用的组件,它可以接收来自系统或其他应用程序发出的广播消息,并根据其定义的逻辑做出相应的操作。

在这篇文章中,我们将重点讨论如何使用BroadcastReceiver来激活(startActivity)一个Activity。

一、什么是广播接收器(BroadcastReceiver)?广播接收器是Android平台的一种组件,用于接收并响应广播消息。

广播消息可以来自系统(如电池电量低等)或其他应用程序(如发送一个自定义广播)。

广播接收器可以在AndroidManifest.xml文件中声明,也可以使用动态注册的方式创建。

当接收到匹配的广播消息时,广播接收器会调用其onReceive()方法进行相应的操作。

二、为什么要使用广播接收器?广播接收器是实现应用程序间通信的一种重要方式。

通过发送和接收广播消息,应用程序可以在不同的组件之间传递数据或进行相应的操作。

例如,当手机的电池电量过低时,系统会发送一个电池低电量的广播消息,应用程序可以通过监听该广播消息来做出相应的处理,如关闭耗电较高的功能或提醒用户充电。

三、激活Activity的意义和使用场景。

在某些特定的场景下,我们可能需要在接收到广播消息时激活一个特定的Activity。

例如,当接收到来自其他应用程序的广播消息,通知用户有新消息,我们可以通过激活一个显示新消息的Activity来提醒用户并处理相关逻辑。

四、如何使用广播接收器激活Activity?下面将一步一步详细介绍如何使用广播接收器激活Activity:1. 创建一个自定义的广播接收器类我们首先需要创建一个继承自BroadcastReceiver的自定义类。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android BroadcastReceiver 详解
Android BroadcastReceiver 详解
版本号
作者
更改内容
日期
A01
杜成见
初版发行
2017-9-25
1 / 17
Android BroadcastReceiver 详解
目录
前言 ............................................................................................................................................3 1. 2. 3. 广播的概念 ........................................................................................................................4 实现原理 ............................................................................................................................4 广播的类型 ........................................................................................................................5 3.1. 3.2. 3.3. 3.4. 4. 5. 普通广播(Normal Broadcast)............................................................................... 5 系统广播(System Broadcast) ............................................................................... 5 有序广播(Ordered Broadcast) ............................................................................. 6 App 应用内广播(Local Broadcast) ....................................................................... 7
1. 广播的概念
Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这 个广播,就知道系统产生了什么事件。 Android 系统在运行的过程中,会产生很多事件,比如开机、电量改变、收发 短信、拨打电话、屏幕解锁
2. 实现原理

Android 中的广播使用了设计模式中的观察者模式:基于消息的发布/订 阅事件模型。 因此,Android 将广播的发送者 和 接收者 解耦,使得系统方便 集成,更易扩展
4 / 17
Android BroadcastReceiver 详解
寻找依据:IntentFilter / Permission 4. AMS 将广播发送到合适的广播接收者相应的消息循环队列中; 5. 广播接收者通过 消息循环 拿到此广播,并回调 onReceive() 特别注意:广播发送者 和 广播接收者的执行 是 异步 的,发出去的广播不会 关心有无接收者接收,也不确定接收者到底是何时才能接收到;
注:当使用系统广播时,只需要在注册广播接收者时定义相关的 action 即可, 并不需要手动发送广播,当系统有相关操作时会自动进行系统广播
3.3.
有序广播(Ordered Broadcast)
定义 发送出去的广播被广播接收者按照先后顺序接收 有序是针对广播接收者而言的 广播接受者接收广播的顺序规则(同时面向静态和动态注册的广播接受者)

模型中有 3 个角色: 1. 消息订阅者(广播接收者) 2. 消息发布者(广播发布者) 3. 消息中心(AMS,即 Activity Manager Service)
示意图

原理描述: 1. 广播接收者 通过 Binder 机制在 AMS 注册 2. 广播发送者 通过 Binder 机制向 AMS 发送广播 3. AMS 根据 广播发送者 要求,在已注册列表中,寻找合适的广播接 收者
BroadcastReceiver 的生命周期 .........................................................................................8 创建 BroadcastReceiver 的步骤 ........................................................................................9 5.1. 5.2. 创建 BroadcastReceiver 的子类 ................................................................................ 9 注册 BroadcastReceiver............................................................................................. 9
//发送广播
sendBroadcast(intent);
若被注册了的广播接收者中注册时 intentFilter 的 action 与上述匹配,则会接收此广 播(即进行回调 onReceive())。如下 mBroadcastReceiver 则会接收上述广播

若发送广播有相应权限,那么广播接收者也需要相应权限
3.2.
系统广播(System Broadcast)
Android 中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍 照等等),都会发出相应的广播
5 / 17
Android BroadcastReceiver 详解
每个广播都有特定的 Intent - Filter(包括具体的 action),Android 系统广播 action 如下:
3.4. App 应用内广播(Local Broadcast)




背景 Android 中的广播可以跨 App 直接通信(exported 对于有 intent-filter 情况下默认值为 true) 冲突 可能出现的问题: o 其他 App 针对性发出与当前 App intent-filter 相匹配的广播,由 此导致当前 App 不断接收广播并处理; o 其他 App 注册与当前 App 一致的 intent-filter 用于接收广播, 获 取广播具体信息; 即会出现安全性 & 效率性的问题。 解决方案 使用 App 应用内广播(Local Broadcast) 1. App 应用内广播可理解为一种局部广播,广播的发送者和接 收者都同属于一个 App。 2. 相比于全局广播 (普通广播) , App 应用内广播优势体现在: 安全性高 & 效率高 具体使用 1 - 将全局广播设置成局部广播 0. 注册广播时将 exported 属性设置为 false,使得非本 App 内部发 出的此广播不被接收;
3. 广播的类型
3.1. 普通广播(Normal Broadc的广播(最常用) 。发送广播使用如下:
Intent intent = new Intent();
//对应 BroadcastReceiver 中 intentFilter 的 action
intent.setAction(BROADCAST_ACTION);
系统操作 监听网络变化 关闭或打开飞行模式 充电时或电量发生变化 电池电量低 电池电量充足(即从电量低变化到饱 满时会发出广播 系统启动完成后(仅广播一次) 按下照相时的拍照按键(硬件按键)时 屏幕锁屏
action .conn.CONNECTIVITY_CHANGE Intent.ACTION_AIRPLANE_MODE_CHANGED Intent.ACTION_BATTERY_CHANGED Intent.ACTION_BATTERY_LOW Intent.ACTION_BATTERY_OKAY Intent.ACTION_BOOT_COMPLETED Intent.ACTION_CAMERA_BUTTON Intent.ACTION_CLOSE_SYSTEM_DIALOGS
6 / 17
Android BroadcastReceiver 详解
1. 按照 Priority 属性值从大-小排序; 2. Priority 属性相同者,动态注册的广播优先; 特点 1. 接收广播按顺序接收 2. 先接收的广播接收者可以对广播进行截断, 即后接收的广播接收者不再接 收到此广播; 3. 先接收的广播接收者可以对广播进行修改, 那么后接收的广播接收者将接 收到被修改后的广播 具体使用 有序广播的使用过程与普通广播非常类似,差异仅在于广播的发送方式: sendOrderedBroadcast(intent); 优先级的定义:-1000~1000 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收 abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播 可以被拦截
2 / 17
Android BroadcastReceiver 详解
前言
ANDROID 四 大 控 件 之 BroadcastReceiver, 在 Android 开 发 中 ,
BroadcastReceiver 的应用场景非常多
相关文档
最新文档