BroadcastReceiver广播接收者
安卓的四大组件
安卓的四⼤组件Android四⼤基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver⼴播接收器。
⼀:了解四⼤基本组件Activity :应⽤程序中,⼀个Activity通常就是⼀个单独的屏幕,它上⾯可以显⽰⼀些控件也可以监听并处理⽤户的事件做出响应。
Activity之间通过Intent进⾏通信。
在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
典型的动作类型有:M AIN(activity的门户)、VIEW、PICK、EDIT 等。
⽽动作对应的数据则以URI 的形式进⾏表⽰。
例如:要查看⼀个⼈的联系⽅式,你需要创建⼀个动作类型为VIEW 的intent,以及⼀个表⽰这个⼈的URI。
与之有关系的⼀个类叫IntentFilter。
相对于intent 是⼀个有效的做某事的请求,⼀个intentfilter 则⽤于描述⼀个activity(或者IntentReceiver)能够操作哪些intent。
⼀个activity 如果要显⽰⼀个⼈的联系⽅式时,需要声明⼀个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW 动作和表⽰⼀个⼈的URI。
IntentFilter 需要在AndroidManifest.xml 中定义。
通过解析各种intent,从⼀个屏幕导航到另⼀个屏幕是很简单的。
当向前导航时,activity 将会调⽤startActivity(Intent myIntent)⽅法。
然后,系统会在所有安装的应⽤程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。
新的activity 接收到myIntent 的通知后,开始运⾏。
当startActivity ⽅法被调⽤将触发解析myIntent 的动作,这个机制提供了两个关键好处:A、Activities 能够重复利⽤从其它组件中以Intent 的形式产⽣的⼀个请求;B、Activities 可以在任何时候被⼀个具有相同IntentFilter 的新的Activity 取代。
Android 应用程序的基本组件
Android 应用程序的基本组件Android 操作系统是目前世界上最流行的移动操作系统之一。
它提供了广泛的应用程序开发工具和框架,使开发者能够轻松地创建出丰富多样的应用程序。
而这些应用程序的基础是由一些基本组件构成的。
本文将介绍 Android 应用程序的基本组件,包括活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。
活动(Activity)是 Android 应用程序的核心组件之一。
它代表了用户与应用程序之间的交互界面。
每个 Android 应用程序都至少包含一个活动,而活动可以包含多个界面元素,例如按钮、文本框、图像等。
活动通过布局文件定义了界面的外观和布局,通过代码来处理用户的操作和响应。
活动之间可以通过意图(Intent)来进行切换和通信,从而实现应用程序之间的流转和交互。
服务(Service)是在后台运行的组件,它可以在没有用户界面的情况下执行长时间运行的操作。
服务通常用于执行一些独立的任务,例如播放音乐、下载文件等。
通过在应用程序中创建服务,开发者可以在用户不可见的情况下执行一些必要的操作,并提供持久性的后台功能。
广播接收器(Broadcast Receiver)是一种用于接收系统广播消息的组件。
广播是 Android 系统中不同组件之间进行通信的一种方式,例如设备启动完成、电池电量变化等。
通过注册一个广播接收器,开发者可以监听和响应系统广播消息,并执行相应的操作。
广播接收器可以用于实现各种功能,例如接收短信、接收网络状态变化等。
内容提供器(Content Provider)是 Android 中用于共享数据的一种机制。
内容提供器允许一个应用程序将其数据暴露给其他应用程序。
通过内容提供器,不同的应用程序可以相互访问和共享数据,实现数据的交互和共用。
例如,系统提供的联系人数据库就是通过内容提供器来共享和访问联系人数据的。
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对象传给它。
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))可以获取上一个接收者存入在结果对象中的数据。
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种类及介绍
广播类型及广播的收发 (1)广播类型: (1)广播的收发: (1)普通广播的发送和接收: (1)有序广播的发送和接收: (2)异步广播的发送和接收: (2)BroadCastReceiver 源码位于:framework/base/core/java/android.content.BroadcastReceiver.java广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。
通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。
广播是一种广泛运用的在应用程序之间传输信息的机制。
而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;广播类型及广播的收发广播类型:普通广播(Normalbroadcasts)发送一个广播,所以监听该广播的广播接收者都可以监听到改广播。
异步广播当处理完之后的Intent,依然存在,这时候registerReceiver(BroadcastReceiver,IntentFilter) 还能收到他的值,直到你把它去掉,不能将处理结果传给下一个接收者,无法终止广播.有序广播(Orderedbroadcasts)按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高.可以终止广播意图的继续传播.接收者可以篡改内容.广播的收发:普通广播的发送和接收:sendBroadcast(intent);< receiver android:name = ".MyBroadcastReceiver" >< intent-filter android:priority = "1000" >< action android:name = "cn.lenovo.yangguangfu" /></ intent-filter ></ receiver >Priority:1,他决定该广播的级别,级别数值是在-1000到1000之间,值越大,优先级越高;2,同级别接收时先后是随机的;再级别低的收到广播;3,在android系统中只要监听该广播的接收者,都能够收到sendBroadcast(intent)发出的广播;4,不能截断广播的继续传播,5,实验现象,在这个方法发来的广播中,代码注册方式中,收到的广播的先后和注明优先级最高的他们的先后是随机。
broadcastreceiver startactivity -回复
broadcastreceiver startactivity -回复「BroadcastReceiver.startActivity」:激活Activity的广播接收器引言:在移动应用开发中,我们经常会遇到需要在不同组件之间进行通信的情况。
广播接收器(BroadcastReceiver)是Android平台中一种很常用的组件,它可以接收来自系统或其他应用程序发出的广播消息,并根据其定义的逻辑做出相应的操作。
在这篇文章中,我们将重点讨论如何使用BroadcastReceiver来激活(startActivity)一个Activity。
一、什么是广播接收器(BroadcastReceiver)?广播接收器是Android平台的一种组件,用于接收并响应广播消息。
广播消息可以来自系统(如电池电量低等)或其他应用程序(如发送一个自定义广播)。
广播接收器可以在AndroidManifest.xml文件中声明,也可以使用动态注册的方式创建。
当接收到匹配的广播消息时,广播接收器会调用其onReceive()方法进行相应的操作。
二、为什么要使用广播接收器?广播接收器是实现应用程序间通信的一种重要方式。
通过发送和接收广播消息,应用程序可以在不同的组件之间传递数据或进行相应的操作。
例如,当手机的电池电量过低时,系统会发送一个电池低电量的广播消息,应用程序可以通过监听该广播消息来做出相应的处理,如关闭耗电较高的功能或提醒用户充电。
三、激活Activity的意义和使用场景。
在某些特定的场景下,我们可能需要在接收到广播消息时激活一个特定的Activity。
例如,当接收到来自其他应用程序的广播消息,通知用户有新消息,我们可以通过激活一个显示新消息的Activity来提醒用户并处理相关逻辑。
四、如何使用广播接收器激活Activity?下面将一步一步详细介绍如何使用广播接收器激活Activity:1. 创建一个自定义的广播接收器类我们首先需要创建一个继承自BroadcastReceiver的自定义类。
Broadcast Receiver
BroadcastReceiver
通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在 BroadcastReceiver里不能做一些比较耗时的操作,如果需要完成一项比较耗 时的工作,可以通过发送Intent给Activity或Service,由Activity或Service来完 成。 public class IncomingSMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {
//发送Intent启动服务,由服务来完成比较耗时的操作 Intent service = new Intent(context, XxxService.class); context.startService(service); //发送Intent启动Activity,由Activity来完成比较耗时的操作 Intent newIntent = new Intent(context, XxxActivity.class); context.startActivity(newIntent);
(2)代码动态注册 (根据自己的需要进行注册,销毁)
如果一个BrodcastReceiver用于更新UI,那么通常会使用这种方发注册, 在Activity启动时注册BrodcastReceiver ,在Activity不可见时取消
@Override protected void onStart() { super.onStart(); //实例化过滤器并设置要过滤的广播 IntentFilter filter = new IntentFilter(BROADCAST) //注册广播 registerReceiver(new MyReceiver(), filter);}
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:跟我们生活中的广播类似,频道,发送者,接收者,一:概念: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的原理和使⽤使⽤中注意的⼏点⼀、1.动态注册、静态注册的优先级在AndroidManifest.xml中静态注册的receiver⽐在代码中⽤registerReceiver动态注册的优先级要低。
发送⽅在sendBroadcast后,ActivityManagerService⾥的broadcastIntentLocked函数会处理⼴播的接收者。
静态注册的接收者存在⼀张表⾥,动态注册的接收者存在另⼀张表,AM S会将两个表合并,按⼴播的优先级排序,如果优先级相同,动态的排在前⾯。
这样动态注册的receiver会先收到⼴播。
静态注册的receiver可以⽤android:priority属性来设置接收⼴播的优先级,这是个4字节整型值,越⼤优先级越⾼。
因为int型范围是2^31-1到2^31,所以要设置最⼤的优先级,在intent-filte r标签⾥可写为android:priority="2147483647"。
如果都是动态注册、并且优先级也相同的两个receiver,在broadcastIntentLocked内部会并⾏地向两个receiver发出Intent。
2.有序⼴播有序⼴播是⽤sendOrderedBroadcast来发送。
⾼优先级的接收者会先接收到⼴播,然后它可以决定是否继续转发,让低优先级的接收者接收到,或者终⽌⼴播。
⾼优先级的接收者可以通过s etResult把⼀些信息传给下⼀个接收者,下⼀个接收者则通过getResult获取上⼀个接收者传过来的信息。
这个优先级也是⽤android:priority来设置,范围是-1000到1000。
3.sendStickyBroadcastSticky的意思是即使没有接收者,发送的⼴播Intent也会⼀直驻留在系统中,⼀旦有receiver 注册,就会⽴即收到之前发送的⼴播。
发送这个⼴播的应⽤需要权限<uses-permissionandroid: name="android.permission.BROADCAST_STICKY" />如果sendStickyBroadcast发了多个⼴播,但暂时没有接收者,系统会保留最后⼀条⼴播。
Android中的BroadcastReceiver注册方式
Android中的BroadcastReceiver注册方式摘要:在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。
不过目前对BroadcastReceiver进行介绍的论文不是很多,本文通过对BroadcastReceiver的生命周期,广播类型,注册方式等方面进行介绍,并通过两个实例使读者对BroadcastReceiver 的注册方式有进一步的了解。
关键词:Android;BroadcastReceiver;注册方式1 BroadcastReceiver简介Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。
其中广播接收器没有用户界面。
然而,它们可以启动一个activity或service 来响应它们收到的信息,或者用NotificationManager 来通知用户。
通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。
你的应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。
一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
BraodcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,它和事件处理机制类似,但是事件处理机制是程序组件级别的,而广播事件处理机制是系统级别的。
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. 广播消息的分类广播消息可以分为普通广播、有序广播和粘性广播。
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 是对发送出来的 广播进行过滤接收 并响应的一类组件。
Ordered broadcasts(有序广播): Ordered broadcasts的接收者按照一定 的优先级进行消息的接收。如:A,B,C
的优先级依次降低,那么消息先传递 给A,在传递给B,最后传递给C。另外 Ordered broadcasts的接收者可以通过 abortBroadcast()的方式取消广播的传 播,也可以通过setResultData和 setResultExtras方法将处理的结果存入 到Broadcast中,传递给下一个接收者。
监听广播
1、 创建BroadcastReceiver的子类,重写onReceive (Context context, Intentintent)方法。 2、 注册BroadcastReceiver。
BroadcastReceiver的生命周期,从对象调用它开 始,到onReceiver方法执行完成之后结束。每次 广播被接收后会重新创建BroadcastReceiver对象, 并在onReceiver方法中执行完就销毁,如果 BroadcastReceiver的onReceiver方法中不能在10 秒内执行完成,Android会出现ANR异常。所以 不要在BroadcastReceiver的onReceiver方法中执 行耗时的操作。
介绍
Android的四大组件
Android的四⼤组件Android的四⼤组件:Activity、Service、BroadcastReceiver、Content Provider。
Content Provider 属于Android应⽤程序的组件之⼀,作为应⽤程序之间唯⼀的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应⽤程序提供访问数据的接⼝① Activity是Android应⽤中负责与⽤户交互的组件——⼤致上把它想象成Swing编程中的JFrame控件。
不过它与JFrame的区别在于:JFrame本⾝可以设置布局管理器,不断地向JFrame中添加组件,但Activity只能通过setContentView(View)来显⽰指定组件。
Activity为Android应⽤提供⾥可视化⽤户界⾯,如果该Android应⽤需要多个⽤户界⾯,那么这个Android应⽤将会包含多个Activity,多个Activity组成Activity栈。
当前活动的Activity位于栈顶。
View组件是所有UI控件、容器控件的基类,View组件就是Android应⽤中⽤户实实在在看到的部分。
但View组件需要放到容器组件中,或者使⽤Activity将它显⽰出来。
如果需要通过某个Activity把指定View显⽰出来,调⽤Activity的setContentView()⽅法即可。
② Service与Activity的地位是并列的,它也代表⼀个单独的Android组件。
Service与Activity的区别在于:Service通常位于后台运⾏,它⼀般不需要与⽤户交互,因此Service组件没有图形⽤户界⾯。
Service组件需要继承Service基类。
⼀个Service组件被运⾏起来之后,它将拥有⾃⼰独⽴的⽣命周期,Service组件通常⽤于为其他组件提供后台服务或监控其他组件的运⾏状态。
③ BroadcastReceiver是Android应⽤中另⼀个重要的组件,BroadcastReceiver代表⼴播消息接收器。
第8章 广播接收者Broadcast Receiver
Page 6
自定义BroadcastReceiver
在第二个Android项目中,接收广播
Page 7
自定义BroadcastReceiver
实例注意事项
两个项目都需要安装到Android系统中,才能看到效果 系统中, 两个项目都需要安装到 系统中 两个项目的包名不能一样, 两个项目的包名不能一样,否则后安装的那个将覆盖掉前 面那个。( 用包来区分应用程序) 面那个。(Android用包来区分应用程序) 。( 用包来区分应用程序
Page 22
闹钟AlarmManager
实例
Байду номын сангаасPage 23
闹钟AlarmManager
实例运行流程:
* 1. AlarmManager设置闹钟,闹钟在某个时刻启动 设置闹钟, 设置闹钟 * 2. 闹钟启动之后,找到对应的 闹钟启动之后,找到对应的PendingIntent * 3. PendingIntent发送广播 目的地由 发送广播(目的地由 指定) 发送广播 目的地由Intent指定 指定 * 4. 广播接受者接收广播
Page 8
接收系统内置广播事件
除了可以自定义广播事件之外,Android还提供了 许多标准的广播Action。这些广播由系统在某种 情形下自动发出,程序员只需要定义 BroadcastReceiver进行接收即可。
Page 9
接收系统内置广播事件
系统内置广播Action常量
常量名称 ACTION_BOOT_ COMPLEMENTED ACTION_TIME_C HANGED ACTION_DATE_C HANGED ACTION_BATERY _LOW ….. 添加包 卸载包 ….. Page 10 电量低 日期改变 常量值 android..intent.action.BOOT_C OMPLETED 查Intent类的API 系统时间改变 含义 系统启动完成时(开机)
第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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广播接收者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))可以获取上一个接收者存入在结果对象中的数据。
如发送有序广播:Intent bcItent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);bcItent.putExtra(Intent.EXTRA_PHONE_NUMBER, phoneNum);Demo实现方式①继承BroadcastReceiver,如MyBroadcastReceiver,同时要在AndroidManifest.xml中注册,application节点下<receiver android:name=".MyBroadcastReceiver">,再重写MyBroadcastReceiver的onReceive(),本函数会在一旦接受到了订阅的广播时就会执行②订阅需求Intent两种方式a)代码订阅如IntentFilter inFilter= newIntentFilter("android.intent.action.BOOT_COMPLETED");//开机启动的广播Intent MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();//当前继承BroadcastReceiver的对象registerReceiver(myReceiver, inFilter);b)AndroidManifest.xml中订阅,如下intent-filter节点下<receiver android:name=".BroadcastReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>其他广播Intent如<action android:name="android.intent.action.BATTERY_CHANGED"/>电池电量变化广播Intent<action android:name="android.provider.Telephony.SMS_RECEIVED"/>短信<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>电话。
注意:在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法,onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。
当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。
所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR (Application No Response)的对话框。
如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。
这里不能使用子线程来解决,因为BroadcastReceiver 的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。
BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。
如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。
所以采用子线程来解决是不可靠的。
BroadCastReceiver 简介(末尾有源码)BroadCastReceiver 源码位于:framework/base/core/java/android.content.BroadcastReceiver.java广播接收者(BroadcastReceiver )用于接收广播Intent ,广播Intent 的发送是通过调用Context.sendBroadcast() 、Context.sendOrderedBroadcast() 来实现的。
通常一个广播Intent 可以被订阅了此Intent 的多个广播接收者所接收。
广播是一种广泛运用的在应用程序之间传输信息的机制。
而BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。
BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后,BroadcastReceiver 可以启动Activity 作为响应,或者通过NotificationMananger 提醒用户,或者启动Service 等等。
BroadCastReceiver 的机制1. 机制在Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。
如图:2. 实现用接收短信举例:第一种方式:实现public class MyBroadcastReceiver extends BroadcastReceiver {// action名称String SMS_RECEIVED= "android.provider.Telephony.SMS_RECEIVED";public void onReceive(Context context, Intent intent) {if(intent.getAction().equals(SMS_RECEIVED)) {// 相关处理:地域变换、电量不足、来电来信;}}}系统注册:在AndroidManifest.xml 中注册<receiver android:name = ".MyBroadcastReceiver"><intent-filter android:priority = "1000"><action android:name = "android.provider.Telephony.SMS_RECEIVED"/> </intent-filter></receiver>当然了需要权限:<uses-permission android:name = "android.permission.RECEIVE_SMS"/><uses-permission android:name = "android.permission.SEND_SMS"/>第二种方式:// 广播接收者-广播的接收private BroadcastReceiver myBroadcastReceiver= new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {//相关处理,如收短信,监听电量变化信息}};代码中注册:IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED "); registerReceiver(mBatteryInfoReceiver, intentFilter);3. 生命周期描述了Android 中广播的生命周期,其次它并不像Activity 一样复杂,运行原理很简单如下图:生命周期只有十秒左右,如果在onReceive() 内做超过十秒内的事情,就会报错。
每次广播到来时, 会重新创建BroadcastReceiver 对象, 并且调用onReceive() 方法, 执行完以后, 该对象即被销毁. 当onReceive() 方法在10 秒内没有执行完毕,Android 会认为该程序无响应. 所以在BroadcastReceiver 里不能做一些比较耗时的操作, 否侧会弹出ANR(Application No Response) 的对话框. 。