BroadcastReceiver种类及介绍

合集下载

Android中广播接收者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的用法

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详解

BroadcastReceiver及Notification详解
break; case R.id.button_main_progress: final Notification.Builder builder3 = new Notification.Builder(this); builder3.setSmallIcon(R.drawable.alert); builder3.setContentTitle("提示:"); builder3.setContentText("数据下载中。。。");
(三)、发送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、常用传感器

第八讲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详解(一)

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

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详解

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)

第七篇 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注释的代码部分,两者选择 一种即可
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()中),在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。

相关文档
最新文档