15_Android-BroadcastReceiver

合集下载

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))可以获取上一个接收者存入在结果对象中的数据。

registerreceiver 间隔

registerreceiver 间隔

registerreceiver 间隔问题: 什么是registerreceiver间隔?引言:在Android开发中,registerReceiver间隔是指在注册BroadcastReceiver时可以为其指定一个间隔时间来限制其接收广播的频率。

这样可以有效控制广播接收的频率,避免不必要的资源消耗和性能问题。

本文将一步一步对registerReceiver间隔进行解析和讨论。

一、概念解释1.1 BroadcastReceiver在Android中,BroadcastReceiver是一种用于接收和处理广播消息的组件。

它可以监听系统广播、自定义广播,或者在应用内发送广播消息。

当一个广播事件发生时,注册了对应BroadcastReceiver的应用组件将会收到该广播并执行相应的逻辑。

1.2 registerReceiverregisterReceiver是一个用于动态注册BroadcastReceiver的方法。

通过调用此方法,应用可以在运行时注册一个BroadcastReceiver。

这可以使应用能够接收到在注册后发送的广播消息。

通常,我们需要在合适的时机调用registerReceiver方法,以确保应用能够正确接收广播消息。

二、问题分析2.1 为什么需要registerReceiver间隔?有些情况下,我们希望控制BroadcastReceiver接收广播的频率,避免频繁触发和处理广播消息。

如果没有限制,当有大量广播消息发送时,应用可能会因为频繁的广播接收和处理而导致性能下降或资源消耗过高。

因此,registerReceiver间隔就成为了一种限制频率的手段。

2.2 registerReceiver间隔的原理是什么?registerReceiver间隔的原理是通过设置一个时间间隔,以确保相同类型的广播消息只有在一定时间间隔内才能被正常接收。

当第一次接收到广播消息后,我们可以记录下这个时刻,并在接下来的一段时间内屏蔽重复的广播消息。

receiver的用法

receiver的用法

receiver的用法一、receiver的基本概念和作用在计算机科学领域,receiver是一个广泛使用的术语,指的是接收器或接收程序。

它可以应用于多个场景和不同的技术中,在软件开发、网络通信、电子设备等方面都有广泛的应用。

本文将探讨receiver的几个常见用法,并介绍其在实际开发中的具体应用。

二、接收器在软件开发中的使用1. 事件驱动编程中的接收器:在事件驱动编程中,receiver经常被用来处理外部触发的事件。

例如,在图形用户界面(GUI)开发中,当用户点击按钮或者键盘输入时,通过注册对应组件的事件监听器,可以将相应事件传递给指定的receiver进行处理。

这种方式可以提高程序响应速度和用户体验。

2. Android开发中BroadcastReceiver:Android平台上有一个特殊类型的receiver叫做BroadcastReceiver。

它是Android系统提供的一种机制,用于在不同组件之间传递消息或其他信息。

通过注册自定义的BroadcastReceiver,我们可以自定义处理特定广播消息,并执行相关业务逻辑。

三、网络通信中使用到的接收器1. Socket编程中socket receiver:Socket编程是网络通信中常见而重要的一种形式。

在TCP/IP模型中,socket是网络通信的一种抽象概念,而socket receiver则负责接收来自其他计算机发送的数据。

Socket receiver首先要创建一个套接字(socket),然后通过监听端口接收传入连接,最后从socket中读取并处理相应数据。

2. MQTT协议中的消息接收器:MQTT(Message Queuing Telemetry Transport)是一种轻量级、灵活、开放和简单易学的与物联网相关的协议。

在MQTT中,receiver被称为subscriber订阅者,用于接收和处理来自publishers发布者发送的消息。

Android深入探究笔记之二十 -- 广播接收者

Android深入探究笔记之二十 -- 广播接收者

Android深入探究笔记之二十-- 广播接收者,BroadcastReceiver 收藏1. 概述广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。

普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。

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

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

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

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

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

Context.sendBroadcast()发送的是普通广播,所有订阅者都有机会获得并进行处理。

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

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

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注册的接收者不管你的程序有没有启动有会起作⽤。

安卓面试题及答案详解版

安卓面试题及答案详解版

安卓面试题及答案详解版1. 问题:什么是Android操作系统?答案: Android操作系统是一种基于Linux内核的开源操作系统,主要用于触屏移动设备,如智能手机和平板电脑。

它由Google公司开发并发布,允许设备制造商和开发者自由地修改和分发。

2. 问题:请解释Android的架构。

答案: Android架构从下到上分为四个层次:- 应用层:包含用户界面和应用程序。

- 应用框架层:提供应用程序开发接口(API)。

- 运行时环境层:包括Android核心库和Android运行时环境。

- Linux内核层:提供底层的硬件抽象层、内存管理、进程管理等功能。

3. 问题: Android应用是如何打包的?答案: Android应用通常使用APK(Android Package)格式进行打包。

APK文件是一个压缩文件,包含应用的代码、资源、资产、库和AndroidManifest.xml文件。

4. 问题:什么是Activity?答案: Activity是Android应用程序中的基本构建块,用于定义用户界面和用户交互。

每个Activity都是一个独立的屏幕,用户可以与之交互。

5. 问题:请解释Intent的概念。

答案: Intent是Android中用于请求操作的抽象描述符。

它可以用于启动Activity、启动服务或广播信息。

Intent可以显式地指定目标组件,也可以隐式地通过Intent Filter来匹配。

6. 问题:如何在Android中处理网络请求?答案:在Android中处理网络请求通常使用HTTP客户端库,如OkHttp或Retrofit。

这些库提供了简化的API来发送HTTP请求和接收响应。

7. 问题:解释Android中的Context对象。

答案: Context是Android中一个非常关键的类,它允许访问应用程序环境的全局信息。

Context可以用于启动Activity、获取资源、启动服务等。

简述BroadcastReceiver的两种注册方法。

简述BroadcastReceiver的两种注册方法。

简述BroadcastReceiver的两种注册方法。

BroadcastReceiver两种注册方法:
一、代码动态注册
1、首先,要创建一个BroadcastReceiver的子类,并重写onReceive方法
2、声明一个IntentFilter对象,指定broadcast的内容
3、注册receiver:
3.1)使用Context.registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法来完成注册;
3.2)使用在AndroidManifest.xml中添加<receiver>标签完成注册;
二、AndroidManifest.xml静态注册
1、声明一个BroadcastReceiver的子类,并重写onReceive方法
2、在AndroidManifest.xml中添加一个<receiver>标签来注册BroadcastReceiver的子类
3、指定・intent-filter/action、・intent-filter/data、・intent-filter/category 等属性来定义broadcast的内容
以上就是BroadcastReceiver的两种注册方法。

使用不同的注册方法,APP可以在固定的时间间隔或者接收指定的广播之后进行响应,从而完成一定的任务。

android broadcastreceiver获取context

android broadcastreceiver获取context

android broadcastreceiver获取context如何在Android的BroadcastReceiver中获取Context?在Android开发中,BroadcastReceiver是一种重要的组件,用于接收系统或应用发送的广播消息。

广播接收器可以监听并响应来自系统和其他应用程序的广播消息,以执行特定的操作。

在许多情况下,我们可能需要在BroadcastReceiver中获取Context,以便执行一些和上下文相关的操作。

本文将介绍如何在Android的BroadcastReceiver中获取Context,以及一些需要注意的问题。

一、什么是BroadcastReceiver?在开始讨论如何在BroadcastReceiver中获取Context之前,首先我们需要了解BroadcastReceiver的基本知识。

BroadcastReceiver是Android中的一种组件,用于接收和响应广播消息。

广播消息可以来自系统、其他应用程序或应用程序本身发送。

开发者可以注册BroadcastReceiver来接收指定类型的广播消息,并在接收到广播消息后执行相应的操作。

使用BroadcastReceiver可以实现一些常见的功能,比如接收来电通知、监听网络变化等等。

在Android中,系统已经定义了很多广播消息,开发者也可以自定义自己的广播消息。

二、BroadcastReceiver的工作机制在理解如何获取Context之前,我们需要了解BroadcastReceiver的工作机制。

当应用程序发送一个广播消息时,系统会根据广播消息的属性和注册的BroadcastReceiver来决定将广播消息传递给哪个BroadcastReceiver。

当BroadcastReceiver接收到广播消息时,它会调用onReceive() 方法来处理接收到的广播消息。

在onReceive() 方法中,开发者可以编写代码来处理广播消息,并执行相应的操作。

android广播的用法

android广播的用法

android广播的用法
Android广播是一种用于在应用程序中发送和接收消息的机制。

广播是一种机制,应用程序可以发送广播消息,而其他应用程序可以注册并接收这些广播消息,并根据需要采取相应的操作。

Android广播有两个主要组成部分:广播发送者和广播接收者。

广播发送者:
1. 创建Intent对象,设置广播的标识(Action)和需要传递的
数据(Extras)。

2. 调用广播发送函数sendBroadcast()、sendOrderedBroadcast()
或sendStickyBroadcast()来发送广播。

广播接收者:
1. 创建一个继承自BroadcastReceiver的广播接收器类。

2. 在AndroidManifest.xml文件中注册广播接收器,设置接收
的广播标识(Action)。

3. 重写广播接收器的onReceive()方法,根据接收到的广播进
行相应的处理。

常见的广播使用场景有:
1. 系统广播:例如设备启动、网络状态变化、电量变化等系统事件的广播。

2. 自定义广播:应用程序内部发送自定义的广播,用于不同组件间的通信。

3. 动态注册广播接收器:在代码中动态注册广播接收器,用于灵活地监听特定的广播事件。

4. 静态注册广播接收器:在AndroidManifest.xml文件中静态注册广播接收器,用于在应用程序安装后自动接收广播。

总之,Android广播是一种强大的通信机制,可以用于应用程序内部的组件间通信,以及与系统和其他应用程序的交互。

广播机制BroadcastReciVer

广播机制BroadcastReciVer

小引:广播,四大组件之一。

BroadcastReciver:跟我们生活中的广播类似,频道,发送者,接收者,一:概念:1..BroadCastReciver:是Android中四大组件之一,2..没有可以显示的界面,3:.BroadcastReciver包括两个概念,分别是广播发送者,和广播接收者4:程序可以自己发送广播自己接收,也可以接收系统或者其他应用程序的广播二:声明周期:1,..onReceive:该函数执行之后广播的声明周期就结束了2…onRecivie默认在主线程中执行所以不能在该方法中做比较耗时的操作,三:广播的类型:无序广播,有序广播1:无序广播:接受者之间没有任何关系,发送者直接发送给若干接收者2:使用sendBrodcast发送,无序并且不可中断的,彼此之间不被第三方因素中断参数:Intent,该intent的作用就是从哪里发送到哪里,实例化一个intent对象参数是;上下文参数,和发送广播到哪里。

另外如果在清单文件中定义了一个action动作,那么就创建另外一个intent这里面的参数就是String,就是清单文件中action的动作。

工作原理就是发送完广播之后到清单文件中找action动作与intent参数相同的那个类,如果相同那么就能够接受到广播。

另外Intent除了这种方式添加action动作之外,还可以用无参构造方法实例化intent并用该对象调用setAction()方法,将action动作的字符串放进去就可以。

3:广播时可以设置接收者权限仅当有权限的时候才有权限也就是频道对了才会有权限4:有序广播:一个传一个,发送者给接送者A,接送者A在给接送者B……..优先级,先接收到的优先级高,也就是说优先级越高接收的越贴近发送者,优先级高的可以中断优先级低的。

5:使用sendorderBrodcast发送,参数第二个为权限可以暂时不用,在该方法中参数也是Intent,另外一个是权限暂且可以不用,7:优先级设置,在清单文件中<intent-filter>中定义的android:priority(优先级的意思)属性设置,数字越大优先级越高,,其中有序广播在意图控制器里面设置优先级关键词是priority,优先级的范围是1到1000 8:被各个接受者逐步接收,优先级高的可以停止广播也可以添加数据给先一个接受者。

broadcastreceiver详解

broadcastreceiver详解

BroadcastReceiver(广播接收器)是Android系统中非常重要的组件之一,它允许应用程序在系统范围内或应用内接收并响应广播消息。

广播消息可以来自系统(如系统启动完成、网络状态变化等)或应用内部(如应用内部组件发出的广播)。

接收到广播消息后,BroadcastReceiver可以启动服务、启动Activity或执行其他操作。

1. BroadcastReceiver的注册和使用在AndroidManifest.xml文件中注册BroadcastReceiver,声明需要监听的广播消息。

同时也可以通过代码方式注册BroadcastReceiver,这种方式更加灵活,可以动态注册和注销Receiver。

```<receiverandroid:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED" /><actionandroid:name=".conn.CONNECTIVITY_CHANGE" /> </intent-filter></receiver>```在BroadcastReceiver中重写onReceive()方法处理接收到的广播消息。

```public class MyBroadcastReceiver extends BroadcastReceiver { Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {// 处理系统启动完成广播} else if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { // 处理网络状态变化广播}}}```2. 广播消息的分类广播消息可以分为普通广播、有序广播和粘性广播。

broadcastreceiver中使用协程

broadcastreceiver中使用协程

broadcastreceiver中使用协程BroadcastReceiver 广播接收器一般用于接收和处理系统发出的广播消息,但是当需要进行网络请求等耗时操作时,为了避免主线程被卡死,可以使用协程来进行异步操作。

在 BroadcastReceiver 中使用协程可以如下:1. 在 BroadcastReceiver 中创建一个协程作用域,可以使用GlobalScope 或者自定义一个 CoroutineScope。

2. 在协程作用域中使用 launch 或者 async 等函数来创建协程,执行需要异步操作的代码。

3. 在协程中进行网络请求等耗时操作,可以使用 Retrofit、OkHttp 或者 HttpClient 等库来发起请求。

4. 接收请求结果,可以使用 suspend 函数,将网络请求转换为挂起函数。

5.使用协程的相关函数来处理协程中的异常和取消操作。

以下是一个简单的例子对广播消息进行异步处理:```kotlin。

class MyReceiver : BroadcastReceiver() 。

// 使用自定义的CoroutineScope。

private val coroutineScope =CoroutineScope(Dispatchers.Main)。

override fun onReceive(context: Context, intent: Intent) 。

//开启一个协程。

unch 。

try 。

//发起网络请求。

val result = doNetworkRequest()。

//处理请求结果。

handleNetworkResult(result)。

} catch (e: Exception) 。

//处理异常。

handleException(e)。

}。

}。

}。

//挂起函数,网络请求操作。

private suspend fun doNetworkRequest(): String 。

android广播机制原理

android广播机制原理

android广播机制原理
Android广播机制是Android中一种用于组件之间进行通信的
机制。

其原理如下:
1. 广播发送:当一个组件(发送者)想要发送广播时,它会创建一个Intent对象,指定广播的Action和一些附加的数据。

然后,组件调用Context的sendBroadcast()方法将广播发送出去。

2. 广播接收:其他的组件(接收者)可以通过注册一个BroadcastReceiver来接收指定Action的广播。

当广播发送后,系统会将广播传递给所有注册了该Action的接收者。

3. 广播过滤:在广播发送时,可以指定IntentFilter来限制只有符合某些条件的接收者才能接收到广播,例如指定广播的权限、指定广播的数据类型等。

4. 广播处理:当接收者收到广播后,系统会自动调用其onReceive()方法,并将广播传递给该方法。

在onReceive()方
法中可以对广播进行处理,例如获取广播中的数据、更新UI 等。

5. 广播顺序:如果有多个接收者注册了同一个Action的广播,系统会按照其注册的顺序依次调用它们的onReceive()方法。

接收者可以通过setPriority()方法来指定自己的优先级,优先
级高的接收者会先收到广播。

通过广播机制,Android中的不同组件(Activity、Service、
BroadcastReceiver等)可以实现松耦合的通信,提高了系统的扩展性和灵活性。

同时,广播也可以用于系统事件的通知,例如屏幕开关、网络状态的改变等。

broadcastreceiver 延迟

broadcastreceiver 延迟

broadcastreceiver 延迟详解在Android开发中,`BroadcastReceiver` 是一种用于接收系统广播和应用内自定义广播的组件。

当应用程序的状态发生变化,或者系统事件发生时,`BroadcastReceiver` 可以捕捉这些广播,并执行相应的操作。

关于"广播接收器的延迟" 的问题可能涉及到不同方面的讨论。

以下是一些可能导致`BroadcastReceiver` 响应延迟的原因:1. 后台执行:如果应用程序在后台运行,系统可能会推迟`BroadcastReceiver` 的执行,以减少对设备性能和电池寿命的影响。

在后台执行的应用可能会受到一些限制,这可能导致广播接收器的延迟。

2. 系统负载:如果系统当前处于高负载状态,例如处理大量后台任务或者其他活动,系统可能会推迟执行`BroadcastReceiver` 以确保资源的有效分配。

3. 优先级:`BroadcastReceiver` 可以通过在清单文件中声明`<intent-filter>` 元素并设置`android:priority` 属性来指定其接收广播的优先级。

如果多个广播接收器都能够处理同一广播,系统将按照它们的优先级来确定哪个接收器将首先收到广播。

因此,优先级较低的接收器可能会在优先级较高的接收器之后被执行。

4. 网络延迟:如果`BroadcastReceiver` 中的操作涉及到网络请求,网络延迟可能会导致`BroadcastReceiver` 的执行受到影响。

5. 电量低:当设备电量较低时,系统可能会推迟一些操作以延长电池寿命。

这可能会影响到`BroadcastReceiver` 的执行。

6. Doze 模式:在Android 6.0 及更高版本中,系统引入了Doze 模式,该模式下系统会将设备置于低功耗状态以延长电池寿命。

在Doze 模式下,一些后台任务可能会受到限制,包括广播的传递和`BroadcastReceiver` 的执行。

第6章 BroadcastReceiver(广播接收者)

第6章 BroadcastReceiver(广播接收者)

广播
• Android内置了很多系统级广播,例如手机开机后 会发送一条广播,电池电量不足时会发送一条广播 、我们的手机定制的闹钟等。
• Android系统提供了广播接收者,可以监听广播事件, 一个广播可以对应有多个接收者接收并进行处理。
BBrrooaaddccaassttRReecceeiivveerr11
……… } }
静态注册
• 当应用程序关闭后,如果接收到广播,那么该程序 会自动重新启动。常驻型广播在清单文件中注册。
• 例如:
<receiver
android:name=".MyReceiver" android:enable =“true“
android:exported =“true“> </receiver>
• 一种完全异步执行的广播,在广播发出去后,所有的广 播接收器几乎都会在同一时刻接收到这条广播消息。
• 发送无序广播时,广播接收器之间是没有先后顺序的。
广播接收器1
发出一条广播
广播接收器2
广播接收器3
2、有序广播
• 一种同步执行的广播,发出之后,同一时刻只有一个广 播接收器能够接收到这条消息。发送有序广播,广播接 收有先后顺序,并且可以被拦截。
案例—杀毒软件
• 有些软件一开机就会自动启动,在Android系统下也可 以实现这种功能,例如,手机一开机便会自动启动,这 种功能通过广播接收者监听开机启动的广播事件实现。
实现步骤
1.创建应用程序 2.编写界面交互代码 3.添加开机启动的广播接收者 4.注册广播并设置权限
AAnnddrrooiidd系系统统 ((产产生生事事件件))
BBrrooaaddccaassttRReecceeiivveerr22 BBrrooaaddccaassttRReecceeiivveerr33

Android的广播接收器(4)分类与优先级

Android的广播接收器(4)分类与优先级
Android的广播接收器分类
A、无序广播:发送方发出后,几乎同时到达多个广播接 收者处,并且无法终止广播继续传播,使用 Context.sendBroadcast(intent); B、有序广播:广播接收者需要提前设置优先级,优先级 高的先接收到广播,而且能终止广播(abortBroadcast()); 使用Context.sendOrderedBroadcast(inr有一个特性:即使应用程序不在运 行,也可以用recevier接收到特定 的广播信息。比如多个 短信应用可能会响应同一条信息。
A,无序广播发送方: Intent intent = new Intent(); intent.setAction("..."); Context.sendBroadcast(intent); B,有序广播发送方: Intent intent = new Intent(); intent.setAction("..."); Context.sendOrderedBroadcast(intent,null);
对于接收同一个广播,在相同优先级的情况下, 1、 动态注册优先级别高于静态注册 2、在动态注册中最早动态注册优先级别最高
3、在静态注册中最早安装的程序,静态注册 优先级别最高(安装APK会解析manifest.xml,把 其加入队列)。

BroadcastReceiver

BroadcastReceiver

BroadcastReceiver当在代码中实时new 一个BroadcastReceiver时,需要为其register对应的intentfilter。

根据Context.java,下面本文将介绍registerReceiver和registerReceiverAsUser两个方法的区别。

---registerReceiver此方法有下面两种参数形式:public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter);public abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,@Nullable String broadcastPermission, @Nullable Handler scheduler);其中,各个参数的含义如下:receiver:处理broadcast的BroadcastReceiverfilter:用来过滤出此此receiver将处理的Broadcast的类型broadcastPermission:broadcaster在发送某种intent的广播时所需要的权限,如果为空,则不需要权限。

scheduler:标识着接受该类Intent的广播的线程,如果为空,则表示进程的主线程作为接收方。

---registerReceiverAsUserpublic abstract Intent registerReceiverAsUser(BroadcastReceiver receiver,UserHandle user, IntentFilter filter, @Nullable StringbroadcastPermission,@Nullable Handler scheduler);此法跟上面的registerReceiver作用相同,只是要向拥有特定id 的user发送broadcast。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、BroadcastReceiver(广播接受者)
该组件接受被广播的intent,Context可以通过sendBroadcast()和sendOrderedBroadcast()方法实现广播。

public class IncomingSMSReceiver extends BroadcastReceiver{
public void onReceiver(Context context,Intent intent){
}
}
注册接收者
编程式((意图action name))
Filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);
IncomingSMSReceiver receiver = new IcomingSMSReceiver();
registerReceiver(receiver,filter);
声明式
<receiver android:name=”.IncomingSMSReceiver”
//要发送者具有该权限
Android:permission=”cn.android.permission.customer”
>
<intent-filter>
<action android:name=”android.provider.Telephony.SMS_RECEIVED”></action> </intent-filter>
</receiver>
ctx.sendBroadcast(intent,”接受者必须具有的权限串”);
手机收到短信后,android系统会广播一个意图(收到短信意图),由接受者收到。

public class IncomingSMSReceiver extends BroadcastReceiver{
//android.provider.Telephony.Sms.Intents.SMS_RECEIVED_ACTION
String SMS_RECEIVED=”android.provider.Telephony.SMS_RECEIVED”; //action名称
public void onReceive(Context context,Intent intent){
if(intent.getAction().equals(SMS_RECEIVED)){
SmsManager sms = SmsManager.getDefault();
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[])bundle.get(“pdus”);
SmsMessage[] messages = new SmsMessage[pdus.length];
for(int i=0;i<pdus.length;i++){
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
for(SmsMessage message : messages){
String msg = message.getMessageBody();
sms.sendTextMessage(to,null,msg,null,null);
}
}
}
}
}
<uses-permission android:name=”android.permission.RECEIVE_SMS”/>
<uses-permission android:name=”android.permission.SEND_SMS”/>
注:android.provider.Telephony.Sms.Intents.getMessageFromIntent(null);
广播类型
普通广播(Normal broadcasts)
异步的,同时被很多接受者一同接收到,不能将处理传给下一个接收者,无法终止广播。

有序广播(Ordered broadcasts)
按照接收者的优先级顺序接收广播,优先级别再intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高,可以终止广播意图的继续传播,接收者可以篡改内容。

<intent-filter android:priority=”1”>
<action android:name=”com.android.frameworks..BROADCST_ABORT”/>
context.sendBroadCast(intent);
//指定权限串发送广播
context.sendBroadCast(intent,permissionStr);
context.sendOrderedBroadCast();
receiver.setResultExtra(bundle);
receiver.getResultExtra(true);
广播接收者的响应
每次广播到来时,会重新创建receiver对象,并且调用onReceive()方法,执行完成之后,该对象即被销毁。

当onReceive()方法在10秒内没有执行完毕,Android会认为该程序无响应,所以在BroadcastReceiver里不能做一些比较耗时的操作,否则会弹出ANR(Application No Response)的对话框。

如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成,这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束。

BroadcastReceiver就先结束了。

BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存是被优先杀死,因为它属于空进程(没有任何活动组件的进程)。

如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死,所以采用子线程来解决时不可靠的。

public void onReceive(Context context,Intent intent){
//发送Intent启动服务,有服务来完成比较耗时的操作
Intent Service = new Intent(content,XxxService.class);
Context.startService(service);
}
<action android:name=”android.intent.action.BATTERY_CHANGED”/>//电量变化
<action android:name=”android.intent.action.BOOT_COMPLETED”/>//启动完成
<uses-permission
android:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>。

相关文档
最新文档