Android broadcastReciever相关

来源:互联网 发布:linux文件指针file 编辑:程序博客网 时间:2024/06/05 20:20

前言

broadcastReciever是Android四大组件之一,属于消息型的组件,它主要在不同组件和应用间传递消息。
下面是Android官方文档的描述:

a.广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。b.应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。c.广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

基本使用

我自己的理解,既然它叫广播接收器,那么它的工作就是,接收广播,过滤,做相应的操作。比如:我们要根据当前的所处地域而做相应的操作,又或者电池电量不足,再或许需要获取来电和短信的内容,此时我们就可以使用broadcastReciever,代码如下:

MyBroadcastReceiver

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里配置

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" />

android:priority 属性是设置组件优先级,数值为-1000到1000,值越大代表优先级越高。

上面只是广播注册的一种方式,我们称之为静态广播,当然还有另一种注册方式,即为动态广播,我们直接在java代码里注册。代码如下:

// 广播接收者 - 广播的接收private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {       @Override       public void onReceive(Context context, Intent intent) {           // 相关处理,如收短信,监听电量变化信息       }    };代码中注册:IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );registerReceiver( mBatteryInfoReceiver , intentFilter);

两者的不同

动态广播:在当前Activity销毁后失效。
静态广播:退出应用仍然有效。
故,举个简单例子,我们要监听手机的开机了,那么就只有使用静态广播。


生命周期

1.broadcastReciever的生命周期很短,10秒~~。每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 ,如果在在broadcastReciever里耗时超过10秒则会ANR。

2.如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时
BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的。


广播类型

广播主要分为:普通广播,异步广播,有序广播。

普通广播: 发送一个广播,所以监听该广播的广播接收者都可以监听到改广播。异步广播:当处理完之后的Intent ,依然存在,这时候registerReceiver(BroadcastReceiver, IntentFilter) 还能收到他的值,直到你把它去掉 , 不能将处理结果传给下一个接收者,无法终止广播。有序广播:按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000 到1000之间,值越大,优先级越高 .可以终止广播意图的继续传播。接收者可以篡改内容。

广播的收发

1.Context 可以通过 sendBroadcast() 和 sendOrderedBroadcast()
方法实现广播的发送 .首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息 ( 如 Action 、 Category) 装入一个 Intent 对象 ,然后通过调用 Context.sendBroadcast() 、 sendOrderBroadcast() 或 sendStickyBroadcast() 方法,把 Intent 对象以广播方式发送出去。

2.使用 sendBroadcast() 或 sendStickyBroadcast() 方法发出去的 Intent ,所有满足条件的 BroadcastReceiver 都会随机地执行其 onReceive() 方法.

3.在将各种广播的发送前,先讲下权限,我们每个广播都可以给自己配置一个权限,代码如下:

AndroidMenifest.xml

<permission android:name="com.example.test.RECEIVE" />  <receiver     android:permission="com.example.test.RECEIVE" /> 

4.普通广播:

sendBroadcast(intent);//普通发送广播sendOrderedBroadcast(intent, receiverPermission);//receiverPermission即为我们的receiver权限,如果广播配置了权限,那么必须传入此参数,为null或不正确则无效。

5.有序广播:

sendOrderedBroadcast(intent, receiverPermission);sendOrderedBroadcast(intent, receiverPermission, resultReceiver,scheduler, initialCode, initialData, initialExtras)resultReceiver:指定BroadcastReceiver 来当作最后的广播接收器。scheduler :调度自定义Handler处理程序,用以安排resultReceiver回调 ; 如果为null将在主线程中执行。initialCode:一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ; initialData:一种结果数据的初始值。通常情况下为空 , 是 String 类型 ;initialExtras:一种结果额外的初始值。通常情况下为空 , 是 Bundle;

6.异步广播:

sendStickyBroadcast(intent);当处理完之后的Intent ,依然存在,直到你把它去掉。发这个广播需要权限<uses-permission android:name="android.permission.BROADCAST_STICKY" />去掉是用这个方法removeStickyBroadcast(intent); 但别忘了在执行这个方法的应用里面 AndroidManifest.xml 同样要加上面的权限;sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,       initialCode, initialData, initialExtras)这个方法具有有序广播的特性也有异步广播的特性;

广播的优先级

两种方式注册的广播的优先级也是不同的,再加上 android:priority 属性,如下:

1.动态广播的优先级>android:priority不是最大值的静态广播2.当我们发送一个普通广播,动态广播注册和android:priority 为1000的静态广播注册的会随机执行其中一个,也就是他们的优先级是相同的。

广播的注销

静态广播不支持注销,而动态广播,我们推荐在onResume里注册,在onPause里注销。

unregisterReceiver(Receiver);
1 0