BroadcastReceiver

一. 广播发送
1. 发送者分为两种:
<1>. 系统广播,只能由Android系统发出,action的定义如下:
ACTION_TIME_TICK    系统时间已经改变。该事件每分钟被广播一次,只能通过动态注册BroadcastReceiver来响应。
ACTION_TIME_CHANGED    系统时间被设置
ACTION_TIMEZONE_CHANGED   系统时区被改变
ACTION_BOOT_COMPLETED     系统启动完成
ACTION_PACKAGE_ADDED     新的应用程序被安装
ACTION_PACKAGE_CHANGED   应用程序被改变
ACTION_PACKAGE_REMOVED   应用程序被卸载
ACTION_PACKAGE_RESTARTED   应用程序被重新启动
ACTION_PACKAGE_DATA_CLEARED   应用程序数据被清空
ACTION_UID_REMOVED    用户ID被删除
ACTION_BATTERY_CHANGED   电量改变
ACTION_POWER_CONNECTED   外接电源被连通
ACTION_POWER_DISCONNECTED  外接电源被断开
ACTION_SHUTDOWN      系统关闭

<2>. 用户自定义广播
两种类型:
普通广播:完全异步,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,并且无法中断广播的传播。通过sendBroadcast(intent)来发送。
有序广播:广播接收者将按预先声明的优先级依次接收Broadcast。在onReceiver()中,广播不会传播到下一个接收者,此时当前的广播接收者可以abortBroadcast()终止广播继续向下传播,也可以将intent中的数据进行修改设置,然后将其传播到下一个广播接收者。
通过sendOrderedBroadcast()来发送。

2. 发送方式:
把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后调用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法把Intent对象以广播方式发送出去。

二. 广播接收:
1. 接收广播的两种方式:
<1>.静态注册
广播接收者就是一个常驻在系统中的全局监听器,无论应用是否处于运行状态,广播接收者都是已经常驻在系统中了。
只要调用PackageManager将Receiver禁用就销毁掉这个广播接收者。
这种模式适合于这样的场景:某事件发生 -> 通知Broadcast -> 启动相关处理应用。
<receiver android:name=".BootBroadcastReceiver" >
    <intent-filter>
        <!-- 自定义action的命名规则一般建议为:包名.intent.类名  -->
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

接收器:

public class BootBroadcastReceiver extends BroadcastReceiver {
    String RECEIVED = "android.intent.action.BOOT_COMPLETED";// action 名称
    public void onReceive(Context context, Intent intent) {
       if (intent.getAction().equals( RECEIVED )) {
       }
    }
}

<2>.动态注册:
通常是在OnResume事件中通过registerReceiver进行注册,在 OnPause等事件中通过unregisterReceiver反注册,通过这种方式使其能够在运行期间保持对相关事件的关注。
如果应用退出后,没有撤销已经注册的接收者应用应用将会报错。
其模式可以归结为:启动应用 -> 监听事件 -> 发生时进行处理。

// 定义Action
public static String RECEIVED_ACTION = "android.intent.action.MY_BROADCAST_ACTION";
// 定义接收器
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) { 
 if (intent.getAction().equals( RECEIVED_ACTION )) {
        } 
    }
};
 
// 注册接收器
protected void onResume(){
    super.onResume();
    IntentFilter intentFilter = new IntentFilter( RECEIVED_ACTION );
    registerReceiver( myBroadcastReceiver, intentFilter);
}
// 注销接收器
protected void onPause(){
    super.onRause();
    unregisterReceiver( myBroadcastReceiver );
}

// 发送广播
Intent intent = new Intent();
intent.setAction(RECEIVED_ACTION);
sendBroadcast(intent);

2. 接收回调方法:
一个BroadcastReceiver可以处理多个广播消息,具体做法为在onReceive()方法调用Intent参数的getAction判断传进来的动作,即可进行不同的处理。
不要创建子线程处理业务,因为它的生命周期很短。正确的处理方法就是通过intent启动Activity作为响应,或者通过NotificationMananger提醒用户,或者启动Service等。

3. 广播接收的顺序:
有序广播:优先级高的先接收;同优先级的动静态广播接收器,动态优先于静态。
普通广播:无视优先级,动态广播接收器优先于静态广播接收器。

转载于:https://my.oschina.net/u/1984976/blog/376197

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值