当前位置: 首页 > article >正文

安卓-广播

在 Android 中,广播(Broadcast)是一种消息机制,允许应用程序之间或应用内部的不同组件(如活动、服务等)进行通信。广播可以用来发送和接收系统事件(如电池电量变化、网络连接状态改变等),也可以用于应用程序内的自定义消息传递。

一、Android 广播概述

广播机制允许一个应用向多个其他应用或系统组件发送消息,而接收方不需要事先知道谁发送了这些消息。广播分为两类:

  1. 系统广播:由系统发出的广播,用于通知设备状态的变化(如电量低、网络状态变化等)。
  2. 自定义广播:应用程序可以定义自己的广播,用于应用内不同组件间的通信。

二、广播的工作流程

广播机制的工作流程通常分为以下几步:

  1. 发送广播:通过 sendBroadcast()sendOrderedBroadcast()sendStickyBroadcast() 方法发送广播。
  2. 接收广播:广播接收器(BroadcastReceiver)负责监听特定的广播事件,并在广播到达时触发相应的回调方法。

三、定义广播接收器(BroadcastReceiver)

广播接收器是一个专门用于接收广播消息的组件。当广播发送到时,系统会调用广播接收器的 onReceive() 方法。

1. 静态注册广播接收器

静态注册广播接收器是在 AndroidManifest.xml 文件中声明的。这种方式适合监听系统级广播,比如网络状态变化、电池状态等。

步骤:

  • AndroidManifest.xml 中注册广播接收器。
  • 重写 onReceive() 方法来处理广播。

示例:监听网络变化的广播

  1. 创建 BroadcastReceiver 子类
public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 当网络状态发生变化时触发
        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        if (noConnectivity) {
            Toast.makeText(context, "Network disconnected", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "Network connected", Toast.LENGTH_SHORT).show();
        }
    }
}
  1. AndroidManifest.xml 中注册广播接收器
<receiver android:name=".NetworkChangeReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
2. 动态注册广播接收器

动态注册广播接收器是在代码中通过 registerReceiver() 方法来注册的。这种方式通常在需要只在应用的特定生命周期内监听广播时使用,比如在 ActivityService 中注册和取消注册。

示例:动态注册广播接收器

public class MainActivity extends AppCompatActivity {
    private NetworkChangeReceiver receiver = new NetworkChangeReceiver();

    @Override
    protected void onStart() {
        super.onStart();
        // 动态注册广播接收器
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 注销广播接收器
        unregisterReceiver(receiver);
    }
}

四、发送广播

Android 提供了多种发送广播的方法,可以根据广播的需求来选择不同的方式。

1. 普通广播(Normal Broadcast)

普通广播是无序的广播,它们是同时发给所有接收器的,所有广播接收器接收到的顺序不确定。使用 sendBroadcast() 方法发送普通广播。

示例:发送普通广播

Intent intent = new Intent();
intent.setAction("com.example.MY_ACTION");
sendBroadcast(intent);
2. 有序广播(Ordered Broadcast)

有序广播是按顺序发送的广播,广播接收器根据优先级依次接收广播。使用 sendOrderedBroadcast() 方法发送有序广播。接收器可以决定是否终止广播的传递。

示例:发送有序广播

Intent intent = new Intent();
intent.setAction("com.example.MY_ORDERED_ACTION");
sendOrderedBroadcast(intent, null);

接收器可以通过设置 android:priority 属性来定义接收优先级。

<receiver android:name=".MyReceiver">
    <intent-filter android:priority="100">
        <action android:name="com.example.MY_ORDERED_ACTION" />
    </intent-filter>
</receiver>
3. 粘性广播(Sticky Broadcast)

粘性广播是一种广播在发送后仍然保留,接收器注册后可以立即接收到上次广播的数据。然而,从 Android 5.0 开始,sendStickyBroadcast() 方法已经被弃用,建议使用其他方式实现类似需求。

五、广播的应用场景

  1. 系统广播应用场景

    • 网络状态变化(android.net.conn.CONNECTIVITY_CHANGE
    • 电池电量变化(android.intent.action.BATTERY_CHANGED
    • 耳机插拔状态(android.intent.action.HEADSET_PLUG
  2. 自定义广播应用场景

    • 应用内模块间的通信。例如,某个模块处理完数据后需要通知 UI 更新。
    • 当应用中的某些事件发生时通知其他组件,比如下载完成通知。

六、广播的最佳实践

  1. 动态广播接收器的使用:对于涉及应用生命周期的广播,最好使用动态注册的方式。动态注册广播接收器时,确保在不需要监听时注销广播,以避免内存泄漏。

  2. 避免使用粘性广播:粘性广播已被废弃,不建议使用。如果需要类似的功能,可以使用 SharedPreferencesLiveData 等机制来代替。

  3. 广播权限控制:广播可能涉及敏感数据或操作,应该通过权限控制限制广播的接收者。可以通过为广播接收器和发送广播设置权限来确保数据的安全性。

示例:发送有权限控制的广播

sendBroadcast(intent, "com.example.permission.MY_BROADCAST_PERMISSION");

七、总结

广播机制在 Android 中为不同组件之间的通信提供了灵活的方式,尤其是系统广播可以帮助应用了解设备状态的变化。通过广播接收器可以监听系统级事件或自定义事件,并根据接收到的消息触发相应的逻辑。


http://www.kler.cn/a/355133.html

相关文章:

  • springboot472基于web网上村委会业务办理系统(论文+源码)_kaic
  • 单片机:实现自动关机电路(附带源码)
  • 前端开放性技术面试—面试题
  • 上传文件(vue3)
  • Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
  • 【快速上手】linux环境下Neo4j的安装与使用
  • 第J3-1周:DenseNet算法实现乳腺癌识别
  • spring-boot学习(2)
  • 从美的第二届远见者大会看AI与能源转型的未来
  • 牛客习题—线性DP 【mari和shiny】C++
  • Java后端基础自测
  • 【人工智能/计算机工程/大数据】第五届人工智能与计算工程国际学术会议(ICAICE 2024,2024年11月8-10日)
  • Android——发送彩信
  • ANSYS Workbench纤维混凝土3D
  • 笔试强训10.19
  • Vue(3) 组件
  • [搜索] 质数
  • openresty通过header_filter_by_lua记录特定的请求头和特定的响应头到日志文件
  • 人工智能产业链发展状况
  • 设计模式之组合模式(Composite)
  • Torch JIT加速推理
  • Matlab中实现类属性仅在首次创建类实例时初始化
  • 芯知识 | NVH-FLASH语音芯片支持平台做语音—打造音频IC技术革新
  • 隐私保护机器学习技术与实践
  • 【C++标准模版库】unordered_map和unordered_set的介绍及使用
  • DMP驱动库