一、什么是广播?

系统状态信息发生改变的时候,会发出对应的不同类型的广播消息,这些消息并不会指定谁来接收,系统中任何的程序都能接收到这些广播消息,进而分析设备状态变化的信息的收发机制。

系统状态信息改变的情况,如:

设备启动、电量发生变化、网络状态发生变化、屏幕锁定和解锁、程序的安装和卸载等。

二、广播的特点:

1.广播的内容是一个Intent,这个Intent可以携带要发送的数据。
2.广播可以被多个App所接收,也可以指定具备特定权限的App接收。

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()获取广播数据。 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐