理解广播与广播接收器
- 广播事件处理属于系统级的事件处理(一般事件处理是属于View级的事件处理)
- 一个应用可以在发生特定事件时发送Broadcast, 系统中任何应用只要注册了对应Receiver就会接收到此Broadcast
- 一个应用如果对某个广播感兴趣, 就可以注册对应的Receiver来接收广播
- 广播事件机制是应用程序(进程间)之间通信的一种手段
相关API
Context
- sendBroadcast(Intent intent) : 发送一般广播
- sendOrderedBroadcast(Intent intent) : 发送有序广播
- registerReceiver(receiver, intentFilter) : 注册广播接收器
- unRegisterReceiver(receiver) : 解注册广播接收器
BroadcastReceiver
- onReceive(Context context, Intent intent) : 接收到广播的回调
- abortBroadcast() : 中断广播的继续传播
- boolean isOrderedBroadcast() : 判断是否是有序广播
常见系统广播
- 收到短信广播 : android.provider.Telephony.SMS_RECEIVED
- 开机完成广播 : Intent.ACTION_BOOT_COMPLETED
- 应用被卸载广播 : Intent.ACTION_PACKAGE_REMOVED
- 手机锁屏 : Intent.ACTION_SCREEN_OFF
- 手机开屏 : Intent.ACTION_SCREEN_ON
案例
静态注册接受器和发一般广播
编写广播接收器类
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getStringExtra("action");
Log.e("TAG","MyBroadcastReceiver onReceive——接受的数据 "+action);
}
}
配置文件注册(静态注册)
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.hbwj.myapplication.MyBroadcastReceiver.action">
</action>
</intent-filter>
</receiver>
发送一般广播
public void sendNormalBC(View view) {
Intent intent = new Intent("com.hbwj.myapplication.MyBroadcastReceiver.action");
intent.putExtra("action", "sendNormalBC");
sendBroadcast(intent);
}
动态注册广播
//动态注册广播
public void registBR(View view) {
if (receiver == null) {
receiver = new MyBroadcastReceiver2();
IntentFilter intent = new IntentFilter("com.hbwj.myapplication.MyBroadcastReceiver.action");
registerReceiver(receiver, intent);
} else {
Toast.makeText(this, "已经注册过了", Toast.LENGTH_SHORT).show();
}
}
//解绑注册
public void unRegistBR(View view) {
if (receiver != null) {
unregisterReceiver(receiver);
receiver = null;
}
}
区别 | 静态注册 | 动态注册 |
---|---|---|
注册方式 | 配置文件 | java代码 |
注册时间 | 应用安装成功/手机开机完成注册时,不会创建对象接收到广播才创建 | 执行registerReceiver(receiver, intentFilter),注册就创建对象 |
生命结束的时间(解注册) | 应用卸载对象执行onReceive()后就回收了 | 执行unregisterReceiver()(activity退出必须解注册)解注册后对象被回收 |
应用情景 | 需要监听的时间为应用的整个生命过程中 | 只服务于某个Activity/Service |
发送两种类型的广播
-
发送一般广播
- context.sendBroadCast(Intent intent) 发送有序广播
- context.sendOrderedBroadcast(Intent intent)
区别两种广播
区别 | 一般广播 | 有序广播 |
---|---|---|
多人接收时是否有序 | 无序, 都会同时执行 | 有序,根据优先级和注册先后依次执行 |
是否可以中断 | 不可以 | 可以, 通过br.abortBroadcast()中断后, 后面的接收器不能接收到此广播了 |