BroadcastReceiver 详细解析

2017-08-21  本文已影响0人  DreamFish

广播是一种广泛运用的在应用程序之间传输信息的机制,主要用来监听系统或者应用发出的广播信息,然后根据广播信息作为相应的逻辑处理,也可以用来传输少量、频率低的数据。

在实现开机启动服务和网络状态改变、电量变化、短信和来电时通过接收系统的广播让应用程序作出相应的处理。

BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以通过启动 Service 、启动 Activity 或是 NotificationMananger 提醒用户。

使用广播的注意事项

当系统或应用发出广播时,将会扫描系统中的所有广播接收者,通过 action 匹配将广播发送给相应的接收者,接收者收到广播后将会产生一个广播接收者的实例,执行其中的 onReceiver() 这个方法;特别需要注意的是这个实例的生命周期只有10秒,如果10秒内没执行结束 onReceiver() ,系统将会报错。在 onReceiver() 执行完毕之后,该实例将会被销毁,所以不要在 onReceiver() 中执行耗时操作,也不要在里面创建子线程处理业务(因为可能子线程没处理完,接收者就被回收了,那么子线程也会跟着被回收掉);正确的处理方法就是通过 intent 调用 Activity 或者 Service 处理业务。

BroadcastReceiver的注册

BroadcastReceiver 的注册方式有且只有两种,一种是静态注册(推荐使用),另外一种是动态注册,广播接收者在注册后就开始监听系统或者应用之间发送的广播消息。

下面通过例子看一下两种注册方式,先定义一个接收短信的 BroadcastReceiver 类:

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 )) {
            // 一个receiver可以接收多个action的,即可以有
            // 多个intent-filter,需要在 onReceive
            // 里面对 intent.getAction(action name) 进行判断。
            ...
        }
    }
}

发送广播主要类型

上一篇下一篇

猜你喜欢

热点阅读