【Android移动开发】BroadcastReceiver详解
在Android中,广播是一种广泛运用在应用程序之间传输信息的机制,广播的内容是一个Intent,这个Intent可以携带要发送的数据。
一、什么是广播?
系统状态信息发生改变的时候,会发出对应的不同类型的广播消息,这些消息并不会指定谁来接收,系统中任何的程序都能接收到这些广播消息,进而分析设备状态变化的信息的收发机制。
系统状态信息改变的情况,如:
二、广播的特点:
3.BroadcastReceiver是负责对广播消息过滤接收并响应的一个组件。
三、广播使用场景:
1. 同一App内有多个进程的不同组件之间的消息通信。
2.不同App之间的组件之间的消息通信
四、消息传递的过程是怎么样的?
1.广播接收者BroadcastReceiver通过Binder机制向AMS中进行注册;
2.广播发送者通过Binder机制向AMS发送广播;
3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播
发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
4.消息循环拿到此广播,回调 BroadcastReceiver 中的 onReceive() 方法。
Tips:广播发送者和广播接受者的执行顺序是异步的,发送者不会关心有无接收者及接收者是否接收。
五、广播的分类
根据注册方式:静态广播和动态广播
根据传播方式:有序广播和无序广播
根据传播范围:系统广播和本地广播
1.静态广播:
在AndroidManifest.xml注册。
<receiver
android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="andriod.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
定义广播接收器:
public class BootCompleteReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();
}
}
发送:
send_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.setAction(“andriod.intent.action.BOOT_COMPLETED”);
//发送广播
MainActivity.this.sendBroadcast(intent); }
});
其注册的BroadcastReceiver的生命周期,伴随整个系统。
若是处理系统广播,无论应用是否运行,该广播接收器都能接受到静态广播
(除被强制停止的应用)
2.动态广播:
需要动态注册BroadcastReceiver:在Java代码中定义IntentFilter(action)对象,然后在需要注册的地方调用Context.registerReceiver()方法
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
NetWorkChangeReceiver networkChangeReceiver = new NetWorkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
//定义广播接收器
public class NetWorkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()){
Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
}
}
广播接收器的生命周期伴随注册它的组件的生命周期。
Context.unregisterReceiver()方法释放动态注册的广播。
protected void onDestroy(){
unregisterReceiver(networkChangeReceiver); // 释放广播
super.onDestroy();
}
3.有序广播:
context.sendOrderBroadcast(Intent)方法发送的广播
广播接收者按其优先级顺序接收,优先级高的先收到广播消息。
同一时刻只有一个广播接收器能收到这条广播消息
有序广播可以被接收器拦截,后面的接收器无法收到它;也可以数据被前面的修改器修改。
//创建有序广播接收器
public class FirstBroadcastReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
Bundle data = getResultExtras(true);
String message = data.getCharSequence("message").toString();
data.putCharSequence("message", message + 1); // 修改数据
setResultExtras(data); // 继续其他接收器传递广播
// abortBroadcast(); // 也可以选择中断有序广播的传递
}
}
}
IntentFilter intentFilter1 = new IntentFilter();
intentFilter1.addAction(“com.myorderbroadcast”);
//设置优先级,取值范围|1000|,默认值为0
intentFilter1.setPriority(1000);
FirstBroadcastReceiver mFirstBroadcastReceiver = new FirstBroadcastReceiver();
registerReceiver(mFirstBroadcastReceiver, intentFilter1);
Intent intent = new Intent();
intent.setAction(“com.myorderbroadcast”);
Bundle bundle = new Bundle();
bundle.putString("message","原始消息");
sendOrderedBroadcast(intent,null,null,null,null, Activity.RESULT_OK,null,bundle);
4.无序广播:
context.sendOrderBroadcast(Intent)方法发送的广播
所有广播接收器几乎在同一时刻接受次广播信息。
消息不能被拦截;数据也不会被修改后再被其他广播接收器接收。
系统广播:
发出的广播可以被其他任意的应用程序接收,或者可以接收来自其他任意应用程序的广播。
Android系统也会主动发出一些系统广播,供所有APP使用,如系统电量不足、网络中断、手机重启、锁屏和解锁等。
举例:
监听网络变化: android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式: Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化: Intent.ACTION_BATTERY_CHANGED
电池电量低: Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播): Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次): Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键): Intent.ACTION_CAMERA_BUTTON
屏幕锁屏: Intent.ACTION_CLOSE_SYSTEM_DIALOGS
设备当前设置被改变时(界面语言、设备方向等): Intent.ACTION_CONFIGURATION_CHANGED
插入耳机时: Intent.ACTION_HEADSET_PLUG
插入外部储存装置(如 SD 卡): Intent.ACTION_MEDIA_CHECKING
成功安装: APK Intent.ACTION_PACKAGE_ADDED
成功删除: APK Intent.ACTION_PACKAGE_REMOVED
重启设备: Intent.ACTION_REBOOT
屏幕被关闭: Intent.ACTION_SCREEN_OFF
屏幕被打开: Intent.ACTION_SCREEN_ON
关闭系统时: Intent.ACTION_SHUTDOWN
5.本地广播:
仅在自己的应用内发送和接受广播。
只能采用动态注册的方式。
IntentFilter intentFilter = new IntentFilter();
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
intentFilter.addAction(“com.zjxu.zzw.mybroadcast”);
localBroadcastRececeiver = new LocalBroadcastReceiver ();
localBroadcastManager.registerReceiver(nasbr, intentFilter);
protected void onDestroy(){
unregisterReceiver(localBroadcastRececeiver ); // 释放本地广播
super.onDestroy();
}
六、广播的使用
Broadcast和BroadcastReceiver的使用
1.首先在需要发送信息的地方,把要发送的数据和用于过滤的Action装入一个Intent对象
然后通过调用Context.sendBroadcast()、sendOrderBroadcast()或者sendStickyBroadcast()方法,将Intent对象以广播的方式发送出去。
2.当Intent发送以后,所有已经注册的BroadcastReceiver,会检查注册时的IntentFilter是否与发送的Intent携带的Action相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法。
3.通过onReceive(Intent)接收的Intent对象,调用getExtra()获取广播数据。
更多推荐
所有评论(0)