Android之BroadcastReceiver(Android中的广播接收器)

来源:互联网 发布:java方法中的作用 编辑:程序博客网 时间:2024/04/28 10:40

BroadcastReceiver是Android的四大组件之一。

BroadcastReceiver是为了实现系统广播而提供的一种组件。并且广播事件处理机制是系统级别的。

一、广播传播机制

1.广播接收器也称全局事件,或系统事件。当Android中的任何程序有动作后,若是想让其他程序知道,一般使用广播的方式传播非常有效。广播从理论上来讲可以将一个动作传播给任意多个程序(但也会受到系统限制)。

2.广播只发送,不会对该广播发送的数据作出处理。(即发送方并不关心接受发是否收到数据,也不会关心接收方如何处理数据)。

3.Android广播的是操作系统的各种各样的事件。例如收到一条短信就会通知用户,即Android系统内部若产生的这些事件,就会向所有广播接收器对象来广播这些事件。


二、广播机制的三要素;

(即:发送方,内容,接收方)

1.广播(Broadcast)--------用于发送广播

2.意图内容(Intent)--------用于保存广播相关信息的媒介

3.广播接收器(BroadcastReceiver)--------用于接收广播

Broadcast是一种广泛应用于应用程序中传递信息的机制,而BroadcastReceiver是对发送过来的Broadcast进行过滤接收并响应的一类组件。


三、广播的生命周期

1.广播接收器仅在执行这个方法(onReceiver())时处于活跃状态,当onReceiver()返回后,它即为失活状态。

2.拥有一个活跃状态的广播接收器的进程被保护起来不会被杀死,但失活状态下的组件的进程会在其他应用程序需要它所占有的内存时,会随时被杀掉。

3.如果响应一个广播信息需要很长一短时间,一般会将其纳入一个衍生的线程(子线程)中去完成,而不是在主线程中完成它,从而保证用户交互过程的流程。

4.广播接收程序的时间限制为10秒。


四、使用广播

1.注册BroadcastReceiver

BroadcastReceiver用于监听被广播的事件,为了达到这个目的,必须进行注册,注册的方式有两种:

①静态注册

在AndroidManifest.xml(清单文件)中application节点下定义receiver并设置要接受的action.

如果清单文件中配置了广播接收器,那么程序在安装后会自动注册广播接收器

特点:用这种方式注册,不管程序以何种方式运行,都会进行监听

实例:

<receiver     android:name=".CallReceiver"    android:enabled="true">    <intent-filter >        <action android:name="android.intent.action.PHONE_STATE"/>    </intent-filter></receiver>
其中,MyReceiver为继承BroadcastReceiver的类,重写了onReceiver方法,并在onReceiver方法中对广播进行处理。<intent-filter>标签设置过滤器,接收指定action广播。


②动态注册

动态注册方式是在Activity里调用当前上下文对象的 registerReceiver()方法注册。其中又个参数,一个是receiver对象,一个是IntentFilter对象。IntentFilter的构造方法的参数是要接受的action.

特点:在java代码中注册后,该应用程序一旦退出,就不在进行监听。

实例:

MyReceiver receiver = new MyReceiver();
//创建过滤器,并指定action,使之用于接收同action的广播IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");//注册广播接收器registerReceiver(receiver, filter);

2.广播的优先级

属性priority表示优先级

<intent-filter android:priority="999" >
设置的值一般在-1000~1000之间

值越大优先级越大,要先接收到广播

补充:根据这个特点,可以在onReceiver()中添加一个数据,可以让优先级低的广播接收者收到该数据进行处理:

setResultExtras(Bundle bundle);

Bundle bundle=getResultExtras(true);


3.发送广播

①无序广播

sendBroadcastReceiver(Intent intent)

// 指定广播目标ActionIntent intent = new Intent("MyReceiver_Action");// 可通过Intent携带消息intent.putExtra("msg", "发送广播");// 发送广播消息sendBroadcast(intent);

②有序广播

sendOrderBroadcastReceiver()


当程序发出一个广播之后,所有与之匹配该Intention的BroadcastReceiver都有可能被启动


4.注销广播接收器

unregisterReceiver(BroadcastReceiver receiver)

①一般在onStart()中注册BroadcastReceiver,在onStop()中注销BroadcastReceiver

②一个BroadcastReceiver对象只有在调用它的onReceiver(Context context,Intention intent)中才有效,当从该方法放回后,该对象就无效了。结束生命周期。


5.接收系统广播

广播接收器最大的用处就是接收系统发出的广播。(例如:拦截短信,来电)


①拦截短信

 <receiver
            android:name=".MySmsReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" >
                </action>
            </intent-filter>
        </receiver>

②拦截来电

 <receiver
            android:name=".MyPhoneReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" >
                </action>
            </intent-filter>
        </receiver>

③手机电量检测

 <receiver
            android:name=".BatteryReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_LOW" >
                </action>
            </intent-filter>
        </receiver>


1 0