BroadcastReceiver种类及介绍
Android中广播接收者BroadcastReceiver详解
Android中⼴播接收者BroadcastReceiver详解1. 接收系统的⼴播步骤(1) 新建⼀个类继承BroadcastReceiver以监听sd卡状态的⼴播接收者为例1public class SdCardBroadcastReceiver extends BroadcastReceiver {23 @Override4public void onReceive(Context context, Intent intent) {5 String action = intent.getAction();6if("android.intent.action.MEDIA_MOUNTED".equals(action)){7 System.out.println("sd卡已挂载");8 }else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){9 System.out.println("sd卡已卸载");10 }11 }1213 }形象⼀点的⽐喻, 这⼀步相当于买了个收⾳机(2) 在清单⽂件中注册1 <!-- 相当于装电池 -->2 <receiver android:name="com.example.sdbroadcast.SdCardBroadcastReceiver">3 <!-- 相当于调频道 -->4 <intent-filter>5 <action android:name="android.intent.action.MEDIA_MOUNTED"/>6 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>7 <data android:scheme="file"/>8 </intent-filter>9 </receiver>这⼀步相当于装电池(3) 在清单⽂件中添加意图过滤器,action⾥写监听的内容1 <!-- 相当于调频道 -->2 <intent-filter>3 <action android:name="android.intent.action.MEDIA_MOUNTED"/>4 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>5 <data android:scheme="file"/>6 </intent-filter>这⼀步相当于调频道了2. 发送⾃定义的⽆序⼴播(1) 发送⼴播1public void startBroadcast(View view){2//开启⼴播3//创建⼀个意图对象4 Intent intent = new Intent();5//指定发送⼴播的频道6 intent.setAction("com.example.BROADCAST");7//发送⼴播的数据8 intent.putExtra("key", "发送⽆序⼴播,顺便传递的数据");9//发送10 sendBroadcast(intent);11 }(2) 接收⼴播新建⼀个类,继承BroadcastReceiver1public class UnorderedReceiver extends BroadcastReceiver {23 @Override4public void onReceive(Context context, Intent intent) {5 String action = intent.getAction();67 String data = intent.getStringExtra("key");89 System.out.println("接受到了⼴播,action:"+ action +",data:"+data);1011//接受到了⼴播,action:com.example.BROADCAST,data:发送⽆序⼴播,顺便传递的数据12 }1314 }记得在清单⽂件中进⾏注册1 <receiver android:name="com.example.selfreceiver.UnorderedReceiver">2 <intent-filter>3 <action android:name="com.example.BROADCAST"/>4 </intent-filter>5 </receiver>打印出的结果:3. 发送⾃定义的有序⼴播(1) 发送⼴播1// 发送有序⼴播2public void sendOrderedBroad(View view) {3 Intent intent = new Intent();4 intent.setAction("com.example.ORDERED");5// 发送⽆序⼴播6 sendOrderedBroadcast(intent,//意图动作,指定action动作7null, //receiverPermission,接收这条⼴播具备什么权限8new FinalReceiver(),//resultReceiver,最终的⼴播接受者,⼴播⼀定会传给他9null, //scheduler,handler对象处理⼴播的分发10 0,//initialCode,初始代码11 "每⼈发10⽄⼤⽶,不得有误!", //initialData,初始数据12null//initialExtras,额外的数据,如果觉得初始数据不够,可以通过bundle来指定其他数据13 );14 }在上⾯的代码中,⼴播发送者发送了⼀条⼴播:"每⼈发10⽄⼤⽶,不得有误!"(2) 接收⼴播新建⼀个类, 继承BroadcastReceiver,并在清单⽂件中进⾏注册以下是所有的⼴播接收者在清单⽂件中的注册权限从-1000 ⾄ 10001) 权限⾼的⼴播接收者可以修改⼴播,甚⾄可以终⽌⼴播权限⾼的⼴播接收者1:1public class ShengReceiver extends BroadcastReceiver {23 @Override4public void onReceive(Context context, Intent intent) {56//获取⼴播的数据7 String data = getResultData();89//修改10 setResultData("中央下达福利,每⼈5⽄⼤⽶");1112 System.out.println("省政府收到指⽰, data : "+data);13 }1415 }在这⾥, 这个接收者修改⼴播为: "中央下达福利,每⼈5⽄⼤⽶"权限低的⼴播接收者1public class PeopleReceiver extends BroadcastReceiver {23 @Override4public void onReceive(Context context, Intent intent) {5//获取⼴播的数据6 String data = getResultData();7 System.out.println("⽼百姓收到福利,感谢党, data : "+data);8 }910 }这样,在控制台打印出来的信息为:权限低的接收者接收到的⼴播就是修改后的了2) 终⽌⼴播权限⾼的⼴播接收者:1public class ShengReceiver extends BroadcastReceiver {23 @Override4public void onReceive(Context context, Intent intent) {56//获取⼴播的数据7 String data = getResultData();89//也可以终⽌⼴播,权限⼩的接收者就接收不到⼴播了10 abortBroadcast();1112 System.out.println("省政府收到指⽰, data : "+data);13 }1415 }控制台打印:权限⼩的就接收不到⼴播了....(3) resultReceiver可以在⼴播发送者的应⽤中建⼀个resultReceiver, ⽤于接收最终到达的⼴播,⽆论⼴播是否终⽌,都会被resultReceiver接收1public class FinalReceiver extends BroadcastReceiver {23 @Override4public void onReceive(Context context, Intent intent) {5 String resultData = getResultData();6 System.out.println("⼈民收到的最终福利是: "+ resultData);7 }89 }控制台打印信息:(终⽌⼴播后):(修改⼴播后):4. 补充:有序⼴播和⽆序⼴播的区别:有序⼴播:发送⽅发出后,⼏乎同时到达多个⼴播接收者处,某个接收者不能接收到⼴播后进⾏⼀番处理后传给下⼀个接收者,并且⽆法终⽌⼴播继续传播;Context.sendBroadcast(intent);有序⼴播:⼴播接收者需要提前设置优先级,优先级⾼的先接收到⼴播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;⽐如存在3个⼴播接收者A、B、C,优先级A>B>C,因此A最先收到⼴播,当A收到⼴播后,可以向⼴播中添加⼀些数据给下⼀个接收者(intent.putExtra()),或者终⽌⼴播(abortBroadcast());Context.sendOrderedBroadcast(intent);。
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及Notification详解
(三)、发送Notification的步骤:(四部曲) 1、调用getSystemService(NOTIFICATION_SERVICE)方法获取系统的NotificationManager服务,它是一个 重要的系统服务。应用程序可以通过NotificationManager 向系统发送全局通知; 2、构造Notification.Builder对象; 3、设置Notification.Builder对象的各种属性; 4、通过NotificationManager 的notify()方法发送Notification。
new Thread(new Runnable() { @Override publicvoid run() { for (int i = 0; i <= 100; i += 5) { builder3.setProgress(100, i, false); nManager.notify(R.id.button_main_progress, builder3.build()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } builder3.setContentText("下载完毕!"); nManager.notify(R.id.button_main_progress, builder3.build());nManager.cancel(R.id.button_main_progress);
第八讲BroadcastReceiver、常用传感器
常用传感器简介
磁场传感器:主要用于读取手机设备外部的磁场强度。随 着手机设备摆放状态的改变,周围磁场在手机的X、Y、Z方向 上的影响会发生改变。磁场传感器会返回三个数据,三个数据 分别代表周围磁场分解到X、Y、Z三个方向上的磁场分量,单 位是微特斯拉。 温度传感器:用于获取手机设备所处环境的温度。温度传 感器会返回一个代表手机设备周围温度数据,单位是摄氏度。 光传感器:用于获取手机设备所处环境的光的强度;光传 感器会返回一个代表手机设备周围光的强度数据,单位是勒克 斯。 压力传感器:用于获取手机设备所处环境的压力的大小; 压力传感器会返回一个代表手机设备周围压力大小的数据。
关键代码
关键代码
关键代码
关键代码
关键代码
关键代码
传感器开发步骤
1、 调用Context的getSystemService(Context.SENSOR_SERVICE)
方法获取Sensor Manager对象,Sensor Manager对象代表系 统的传感器管理服务; 2、 调用SensorManager的getDefaultSensor(int type)方法来 获取指定类型的传感器;
建对应的BroadcastReceiver实例,并自动触发它的
onReceive()方法,onReceive()方法执行完后, BroadcastReceiver的实例就会被销毁。 如果BroadcastReceiver的onReceive()方法不能在10 秒内执行完成,Android会认为该程序无响应。所以不要 在广播接收者的onReceive()方法里执行一些耗时的操作,
rate),该方法中参数说明如下:
listener:监听传感器事件的监听器。该监听器需要实现
BroadcastReceiver详解(一)
BroadcastReceiver详解(⼀)今天我们来讲⼀下Android中BroadcastReceiver的相关知识。
BroadcastReceiver也就是“⼴播接收者”的意思,顾名思义,它就是⽤来接收来⾃系统和应⽤中的⼴播。
在Android系统中,⼴播体现在⽅⽅⾯⾯,例如当开机完成后系统会产⽣⼀条⼴播,接收到这条⼴播就能实现开机启动服务的功能;当⽹络状态改变时系统会产⽣⼀条⼴播,接收到这条⼴播就能及时地做出提⽰和保存数据等操作;当电池电量改变时,系统会产⽣⼀条⼴播,接收到这条⼴播就能在电量低时告知⽤户及时保存进度,等等。
Android中的⼴播机制设计的⾮常出⾊,很多事情原本需要开发者亲⾃操作的,现在只需等待⼴播告知⾃⼰就可以了,⼤⼤减少了开发的⼯作量和开发周期。
⽽作为应⽤开发者,就需要数练掌握Android系统提供的⼀个开发利器,那就是BroadcastReceiver。
下⾯我们就对BroadcastReceiver逐⼀地分析和演练,了解和掌握它的各种功能和⽤法。
⾸先,我们来演⽰⼀下创建⼀个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运⾏。
要创建⾃⼰的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive⽅法。
下⾯我们就创建⼀个名为MyReceiver⼴播接收者:[java]1. package com.scott.receiver;2.3. import android.content.BroadcastReceiver;4. import android.content.Context;5. import android.content.Intent;6. import android.util.Log;7.8. public class MyReceiver extends BroadcastReceiver {9.10. private static final String TAG = "MyReceiver";11.12. @Override13. public void onReceive(Context context, Intent intent) {14. String msg = intent.getStringExtra("msg");15. Log.i(TAG, msg);16. }17.18. }在onReceive⽅法内,我们可以获取随⼴播⽽来的Intent中的数据,这⾮常重要,就像⽆线电⼀样,包含很多有⽤的信息。
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);}
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的接收员(Broadcast Receiver)
• 广播接收器只能接收广播,对广播的通知 做出反应,很多广播都产生于系统代码, 如:时区改变的通知、电池电量不足、用 户改变了语言偏好,或者开机启动等。 • 广播接收器没有用户界面,但是它可以为 它们接收到信息启动一个Activity或者使用 NotificationManager来通知用户.
BroadcastReceiver 接收广播方式
• Ordered broadcasts(有序广播),用 Context.sendOrderedBroadcast()发送每次被发 送到一个receiver。
• 所谓有序,就是每个receiver执行后可以传播到下 一个receiver,也可以完全中止传播——不传播给 其他receiver。而receiver运行的顺序可以通过 matched intent-filter 里面的android:priority来控 制,当priority优先级相同的时候,Receiver以任 意的顺序运行。
• 广播Intent的发送是通过调用 Context.sendBroadcast()、 Context.sendOrderedBroadcast()、 Context.sendStickyBroadcast()来实现的。 • 通常一个广播Intent可以被订阅了此Intent 的多个广播接收者所接收,广播接收者和 JMS中的Topic消息接收者很相似。
BroadcastReceiver总结
• BroadcastReceiver需要先注册receriver(静态或 动态)—> 发送广播sendBroadcast(intent) —> 处理广播onReceive(Context context, Intent intent) —> 启动服务startService(it) —> 关闭服务 stopService(it) • 其中,receriver两种注册方式,静态注册在 AndroidManifest.xml中的receiver和动态注册在 PlayMusicRecevicer注释的代码部分,两者选择 一种即可
【推荐下载】Android四大组件之Broadcast receiver
Android 四大组件之Broadcast receiver2017/08/17 0 1、Broadcast receiver 概述broadcast receiver 是一个用来响应系统范围内的广播的组件。
很多广播发自于系统本身。
—例如, 通知屏幕已经被关闭、电池低电量、照片被拍下的广播。
应用程序也可以发起广播。
—例如, 通知其它程序,一些数据被下载到了设备,且可供它们使用。
虽然广播并不提供用户交互界面,它们也可以创建一个状态栏通知来提醒用户一个广播事件发生了。
尽管如此,更多的情形是,一个广播只是进入其它组件的一个“门路”,并试图做一些少量的工作。
例如,它可能发起一个服务,并通过服务执行与这个广播事件相关的工作。
broadcast receiver 是BroadcastReceiver 的子类实现,而且每一个广播通过Intent 对象来传递。
更多信息,请阅读BroadcastReceiver 类。
来源:android-doc/guide/components/fundamentals.html2、源码:服务端:public static final String XXX_BROADCAST = com.XXX.XXXProvider.XXX_BROADCAST ; public void onBroadcast() { // TODO implement here //使用静态的方式注册广播,可以使用显示意图进行发送广播Intent broadcast = new Intent(XXX_BROADCAST); broadcast.putExtra( Info , 广播内容sendBroadcast(broadcast, null); }客户端:protected ProviderBroadcastReceiver receiver;public static final String PEOPLEINFO_BROADCAST = com.xxx.XXXInfoProvider .PEOPLEINFO_BROADCAST /** * 注册广播*/private void registerBroadcast() { IntentFilter counterActionFilter = new IntentFilter(XXX_BROADCAST); receiver = new ProviderBroadcastReceiver(); logger.debug(TAG_PROVIDER 注册广播!getContext().registerReceiver(receiver, counterActionFilter);}/** * 注销广播*/public void unregisterBroadcast() { logger.debug(TAG_PROVIDER 解绑广播!getContext().unregisterReceiver(receiver);}/** * 广播接收端*/public class ProviderBroadcastReceiver extends BroadcastReceiver { String info = null; @Override。
Android平台下的四大组件详解之Broadcast receivers
Android平台下的四大组件详解之Broadcast receiversAndroid的一个核心特性就是,一个应用程序能利用另外应用程序的元素(假如这些应用程序允许这样做)。
举个例子,如果你的程序需要展示一个可以滚动的图片列表,正好有另外一个程序已经有这样一个合适的滚动条并且也允许其他程序使用,那么你就可以使用这个滚动条来完成你的工作,而不是开发你自己的。
你的应用不需要内含其他应用的代码或者连接到他。
相反,它只是简单的启动了需要的部分。
为了让这个特性能够工作,系统必须能够实现运行一个部分组件被需要的应用,并为那个部分实例化一个Java对象。
因此,与大多数系统上的应用不一样,Android应用没有为应用中的任何部分提供一个单一的入口(比如说,没有main()函数)。
相反的,他们用系统能实例和运行的本质组件。
下面我们将介绍Android4大组件之Broadcast receivers广播接收器只能接收广播,对广播的通知做出反应。
很多广播都产生于系统代码--举例,时区改变的通知,电池电量不足,照了一张相片,或者用户改变了语言偏好。
应用也可以发出广播--举例,让其他应用知道已从网上下载了一些数据,并且它们可以使用这些数据。
一个应用可以有很多广播接收器来对它认为重要的通知做出反应。
所有的接收器继承于BroadcastReceiver基类。
广播接收器不展示一个用户界面。
但是,它们可以为他们接收到得信息启动一个活动,或者它们可以使用NotificationManager来通知用户。
通知可以以不同形式得到用户的注意--闪烁背景灯,震动手机,发出声音,等等。
它们通常在状态栏上放置一个暂时的图标,用户可以通过打开这个图标获取信息。
原文:3G开发者论坛/bbs/forum.php?mod=viewthread&tid=13287&fromuid=1609。
broadcastreceiver和service实例 -回复
broadcastreceiver和service实例-回复broadcastreceiver(广播接收器)和service(服务)是Android应用开发中两个重要的组件。
本文将详细介绍broadcastreceiver和service 的概念、用途以及如何在应用中使用它们。
首先,我们来了解一下broadcastreceiver(广播接收器)。
广播接收器是一种Android组件,用于接收系统和应用程序发出的广播消息。
广播消息可以由系统事件、应用程序组件或其他应用程序发出,例如设备启动、网络连接状态变化、电池电量变化等。
广播接收器可以在应用程序内部注册,监听感兴趣的广播,一旦广播消息到达,广播接收器会被激活,并执行相应的处理逻辑。
广播接收器的主要作用是响应系统或其他应用程序的广播消息,通过接收和处理这些广播消息,我们可以实现一些与系统或其他应用程序交互的功能。
例如,我们可以注册一个广播接收器来监听网络状态变化的广播消息,一旦网络连接状态发生变化,我们就可以在广播接收器中执行相应的逻辑,例如更新UI、触发后台操作等。
接下来,我们来了解一下service(服务)。
服务是一种后台运行的组件,用于执行长时间运行的操作,而不需要与用户界面进行交互。
服务可以在应用程序内部启动,一旦启动,服务将在后台运行,并可以进行一些耗时的操作,如下载文件、播放音乐、处理数据等。
服务的主要作用是为应用程序提供后台的运行环境,以执行一些不需要用户干预的操作。
与广播接收器不同,服务通常用于执行一些长时间运行的任务,例如后台下载、数据处理等。
服务可以在应用程序的前台或后台运行,甚至在应用程序退出时仍然运行。
在实际应用开发中,我们通常会将广播接收器和服务结合使用,以实现更复杂的功能。
例如,在一个音乐播放器应用程序中,我们可以注册一个广播接收器来监听耳机插入的广播消息,一旦耳机插入,我们可以启动一个服务来播放音乐。
在这个例子中,广播接收器负责监听耳机插入事件,而服务负责播放音乐。
黑马程序员安卓教程:BroadCastReceiver 基本概念
BroadCastReceiver 基本概念在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。
而 BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件,是Android四大组件之一。
广播接收者(BroadcastReceiver)用于接收广播的,广播的发送是通过调用sendBroadcast(Intent)/sendOrderedBroadcast(Intent)来实现的。
通常一个广播可以被多个广播接收者所接收。
广播被分为两种不同的类型:“普通广播(Normal Broadcasts)”也叫无序广播和“有序广播(Ordered Broadcasts)”。
1、普通广播是完全异步(就是不会被某个广播接收者终止)的,可以在同一时刻(逻辑上)被所有接收者接收到(其实被接收者接收到也是由顺序的,接收者配置的优先级越高,越先接收到,也就是说广播接收者的优先级对于无序广播也是有用的),消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播的传播。
2、有序广播是按照接收者声明的优先级别,被接收者依次接收广播。
如:A 接收者的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。
在传递的过程中如果有某个接收者终止(abortBroadCast)了该广播,那么后面的接收者就接收不到该广播。
3、广播接收者属于四大组件之一,因此通常需要在 AndroidManifest.xml 中进行注册,优先级别声明在intent-filter 元素的android:priority 属性中,数越大优先级别越高,取值范围:-1000 到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置。
4、有序广播的接收者可以终止广播的传播,广播的传播一旦终止,后面的接收者就无法接收到广播,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。
物联网开发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方法中执 行耗时的操作。
介绍
broadcastreceiver的特点
broadcastreceiver的特点广播类型广播可分为无序广播和有序广播:无序广播无序广播即广播被发送后,BroadCastReceiver之间是无顺序,完全异步的,各个Receiver之间无关联。
无序广播无法通过abortBroadcast终止,也无法使用setResult和getResult来传递处理结果。
无序广播直接通过Context.sendBroadcast()来发送。
有序广播有序广播即广播发送后会按照优先级顺序被不同的广播接收器接收,优先级可以通过intent-filter的android:priority属性来设置,定义范围为-1000~1000,数值越大,优先级越高(如果优先级相同,1. 发送广播的进程会优先接收2. 先注册的Receiver先接收)。
有序广播发送后,会被优先级最高的BroadCastReceiver接收,然后在处理完毕后依次被优先级较低的BroadCastReceiver接收,期间,BroadCastReceiver 可以设置setResult将该广播的处理结果传递给下一个BroadCastReceiver,下一个Receiver通过getResult获取。
有序广播被接收时,还可以通过abortBroadcast来终止,终止后,广播不会继续传递给其他Receiver。
如:开发一个拦截短信的功能,我们将priority设置为1000,来最大限度的保证短信可以被我们的Receiver接收,在接收后,如果不想短信显示在系统短信列表中,我们可以abortBroadcast来终止传递,此时也就不会有短信提示音,也不会再短信收件箱中看到该短信。
有序广播需要通过Context.sendOrderedBroadcast来发送粘性广播其实将粘性广播与有序广播/无序广播放在一起讲并不是非常合适,因为对它们的定义并不是在同一个维度上。
粘性广播通过Context.sendStickyBroadcast()来发送,它与非粘性广播的区别是,在onReceiver中粘性广播不受10s限制(普通广播onReceiver在10s未处理完毕,会抛出ANR),粘性广播在10s后仍然存在,直至广播处理完毕。
第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
解析BroadcastReceiver之你需要了解的一些东东
解析BroadcastReceiver之你需要了解的⼀些东东 前些天把四⼤组件之⼀的Service扯了⼀遍,今天就要开始谈谈它的弟兄BroadcastReceiver了。
写到这⾥我挺纠结的,因为⼴播接收者确实⽐较简单,但是各位就不要以为简单的就不内涵,也许我们慢慢探讨⼀下还能有另外⼀⽚天地。
惯例还是先会介绍⼀下基础的知识,后⾯会说说关于BroadcastReceiver的接收顺序还有其他的⼀些⼩知识。
BroadcastReceiver的作⽤主要是⽤来监听系统或者应⽤发出的⼴播信息,然后根据⼴播信息作为相应的逻辑处理;说通俗点其实上就是⼀种全局监听器,要来实现系统中不同组件之间的通信。
有时候也会⽤来作为传输少量⽽且发送频率低的数据,但是如果数据的发送频率⽐较⾼或者数量⽐较⼤就不建议⽤⼴播接收者来接收了,因为这样的效率很不好,因为BroadcastReceiver接收数据的开销还是⽐较⼤的。
我们先来看看⼴播接收者的代码,如下:1public class MyBroadcastReceiver extends BroadcastReceiver {2 @Override3public void onReceive(Context arg0, Intent arg1) {4// ⽤来实现⼴播接受者接收到⼴播后执⾏的代码逻辑5 }6 } 简单⽽完美,实现⼀个⼴播接受者仅仅需要我们重写⼀个函数onReceiver(),如果⼴播接受者接收到⼴播后将会执⾏该函数;但是这个前提是需要将这个⼴播接收者进⾏注册,⼀般来说,BroadcastReceiver的注册⽅式有且只有两种,⼀种是静态注册,另外⼀种是动态注册,⼴播接收者在注册后就开始监听系统或者应⽤之间发送的⼴播消息。
静态注册的⽅式:打开AndroidManifest清单⽂件中,像Activity、Service那种添加⼀个数据项进⾏注册,如下:<receiver android:name=".MyBroadcastReceiver"> <intent-filter> <!-- action的命名规则⼀般建议为:包名.intent.类名 --> <action android:name="168.testBcr.intent.mybroadcastreceiver"/> </intent-filter></receiver> 静态注册的⼴播接收者就是⼀个常驻在系统中的全局监听器,也就是说如果你应⽤中配置了⼀个静态的BroadcastReceiver,⽽且你安装了应⽤⽽⽆论应⽤是否处于运⾏状态,⼴播接收者都是已经常驻在系统中了。
Broadcast Receiver
Broadcast ReceiverBroadcast Receiver用于应用程序之间传递信息。
Broadcast分为:Normal Broadcasts和Ordered Broadcasts。
Normal Broadcasts是异步Broadcast,广播接收器几乎同一时间接收广播,不分时间先后顺序,级别高的比级别低的先收到广播,动态注册的比静态注册的先收到广播。
没有反馈。
Ordered Broadcasts是有序广播,同级别的Broadcast同一时间只能有一个BroadcastReceiver接收到,级别高的比级别低的先收到广播,动态注册的比静态注册的先收到广播。
Ordered Broadcast可截断广播,如果截断,后续的没有接收到的将不能接收到。
在onReceive()中,接收器可以把结果返回给广播:setResultCode(Activity.RESULT_OK);setResultData("simple response string!");Bundle bundle=getResultExtras(true);//设置当前相应的extras//设置组件名称bundle.putParcelable("componentName",newComponmentName(Conytext,getClass()));应用程序可发送和接收广播。
发送广播1、发送本地广播只能在应用程序内部传递,其他应用接收不到。
并且广播接收器也也只能接收到来自本应用程序发出的广播。
只在应用程序的进程内发送和接收广播。
更安全,更高效,不需要跨进程管理操作。
1)创建LocalBroadcastManagerLocalBroadcastManager localBroadcastmanager=LocalBroadcastManager.getInstance(this);2)发送:Intent intent=new Intent("com.wuzhiyuan.myBroadcast.local_broadcast");localbroadcastmanager.sendBroadcast(intent);3)注册广播localbroadcastmanager.registerReceiver(myReceiveBroadcast,intentFilter);4)取消注册localbroadcastmanager.unregisterReceiver(myReceiveBroadcast);2、send Normal Broadcast(sendBroadcast(intent);)Intent intent=new Intent("com.wuzhiyuan.myBroadcast.local_broadcast");sendBroadcast(intent);3、send Ordered Broadcast(sendBroadcast)Intent intent=new Intent("com.wuzhiyuan.myBroadcast.local_broadcast");sendOrderedBroadcast(intent,null);注:发送ordered Broadcast后,其中一个接收广播的onReceive()中添加abortBroadcast();后续的所有广播接收器都将收不到广广播。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广播类型及广播的收发 (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,实验现象,在这个方法发来的广播中,代码注册方式中,收到的广播的先后和注明优先级最高的他们的先后是随机。
如果都没有优先级,代码注册收到为最先。
有序广播的发送和接收:
sendOrderedBroadcast(intent,receiverPermission);
sendOrderedBroadcast(intent,receiverPermission, resultReceiver,
scheduler,initialCode, initialData, initialExtras)
receiverPermission这是权限,一个接收器必须持以接收您的广播。
如果为null,不经许可的要求。
resultReceiver您自己BroadcastReceiver来当作最后的广播接收器。
scheduler调度自定义处理程序,用以安排resultReceiver回调;如果为null将语境中的主线程举行。
initialCode一种结果代码的初始值。
通常为Activity.RESULT_OK。
这个值是-1;为其他int型也可以,如0,1,2;
initialData一种结果数据的初始值。
通常情况下为空,是String类型; initialExtras一种结果额外的初始值。
通常情况下为空,是Bundle;
1,该广播的级别有级别之分,级别数值是在-1000到1000之间,值越大,优先级越高;
2,同级别接收是先后是随机的,再到级别低的收到广播;
3,同级别接收是先后是随机的,如果先接收到的把广播截断了,同级别的例外的接收者是无法收到该广播的。
(abortBroadcast())
4,能截断广播的继续传播,高级别的广播收到该广播后,可以决定把该钟广播是否截断掉。
5,实验现象,在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。
异步广播的发送和接收:
sendStickyBroadcast(intent);
当处理完之后的Intent,依然存在,直到你把它去掉。
发这个广播需要权限
<uses-permissionandroid:name="android.permission.BROADCAST_STICKY" />
去掉是用这个方法removeStickyBroadcast(intent);但别忘了在执行这个方法的
应用里面AndroidManifest.xml同样要加上面的权限;sendStickyOrderedBroadcast(intent,resultReceiver, scheduler,
initialCode,initialData, initialExtras)
这个方法具有有序广播的特性也有异步广播的特性;
发送这个广播要:
<uses-permissionandroid:name="android.permission.BROADCAST_STICKY" />这个权限。
才能使用这个方法。
如果您并不拥有该权限,将抛出SecurityException 的。
实验现象(sendStickyOrderedBroadcast()中),在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。