一. 广播发送
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. 广播接收的顺序:
有序广播:优先级高的先接收;同优先级的动静态广播接收器,动态优先于静态。
普通广播:无视优先级,动态广播接收器优先于静态广播接收器。