深入分析 Android BroadcastReceiver (三)

文章目录

    • [深入分析 Android BroadcastReceiver (三)](#深入分析 Android BroadcastReceiver (三))
    • [1. 广播消息的优缺点及使用场景](#1. 广播消息的优缺点及使用场景)
      • [1.1 优点](#1.1 优点)
      • [1.2 缺点](#1.2 缺点)
    • [2. 广播的使用场景及代码示例](#2. 广播的使用场景及代码示例)
    • [3. 优化策略](#3. 优化策略)
    • [4. 总结](#4. 总结)

深入分析 Android BroadcastReceiver (三)

1. 广播消息的优缺点及使用场景

1.1 优点

  1. 松耦合:广播机制允许应用组件之间以松散耦合的方式进行通信,而不需要彼此了解具体实现。
  2. 灵活性:广播可以在应用的各个部分之间传递消息,甚至跨进程传递。
  3. 系统广播:系统广播可以通知应用系统事件(如网络变化、电量低等),使得应用能及时响应系统状态变化。

1.2 缺点

  1. 性能问题:在主线程中处理广播消息,如果操作耗时,会导致应用卡顿。
  2. 安全性:公开广播可能被其他应用接收和发送,可能带来安全隐患,需要合理使用权限管理。
  3. 电量消耗:频繁的广播通信会增加设备的电量消耗,尤其是在后台频繁接收广播时。

2. 广播的使用场景及代码示例

2.1. 系统广播

系统广播是 Android 系统在特定事件发生时发出的广播,比如设备启动完成、网络状态变化等。

示例:监听网络状态变化

AndroidManifest.xml 中声明接收器:

xml 复制代码
<receiver android:name=".NetworkChangeReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

接收器实现:

java 复制代码
public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = 
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.isConnected()) {
            Toast.makeText(context, "Network Connected", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "Network Disconnected", Toast.LENGTH_SHORT).show();
        }
    }
}

2.2. 自定义广播

应用内自定义广播,用于应用内部组件之间的通信。

示例:发送自定义广播

发送自定义广播:

java 复制代码
Intent intent = new Intent("com.example.CUSTOM_ACTION");
intent.putExtra("data", "Broadcast Data");
sendBroadcast(intent);

AndroidManifest.xml 中声明接收器:

xml 复制代码
<receiver android:name=".CustomReceiver">
    <intent-filter>
        <action android:name="com.example.CUSTOM_ACTION"/>
    </intent-filter>
</receiver>

接收器实现:

java 复制代码
public class CustomReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String data = intent.getStringExtra("data");
        Toast.makeText(context, "Received: " + data, Toast.LENGTH_SHORT).show();
    }
}

2.3. 有序广播

有序广播允许多个接收器按优先级顺序接收,并且可以中止广播的传播。

示例:有序广播

发送有序广播:

java 复制代码
Intent intent = new Intent("com.example.ORDERED_ACTION");
sendOrderedBroadcast(intent, null);

AndroidManifest.xml 中声明接收器,并设置优先级:

xml 复制代码
<receiver android:name=".FirstReceiver" android:priority="100">
    <intent-filter>
        <action android:name="com.example.ORDERED_ACTION"/>
    </intent-filter>
</receiver>

<receiver android:name=".SecondReceiver" android:priority="50">
    <intent-filter>
        <action android:name="com.example.ORDERED_ACTION"/>
    </intent-filter>
</receiver>

接收器实现:

java 复制代码
public class FirstReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "First Receiver", Toast.LENGTH_SHORT).show();
        // 继续传播广播
    }
}

public class SecondReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Second Receiver", Toast.LENGTH_SHORT).show();
        // 可以中止广播传播
        abortBroadcast();
    }
}

2.4. 本地广播

本地广播用于应用内部组件通信,避免跨进程通信带来的安全和性能问题。

示例:发送本地广播

发送本地广播:

java 复制代码
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent localIntent = new Intent("com.example.LOCAL_ACTION");
localIntent.putExtra("data", "Local Broadcast Data");
localBroadcastManager.sendBroadcast(localIntent);

动态注册本地广播接收器:

java 复制代码
@Override
protected void onStart() {
    super.onStart();
    IntentFilter filter = new IntentFilter("com.example.LOCAL_ACTION");
    LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, filter);
}

@Override
protected void onStop() {
    super.onStop();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver);
}

private BroadcastReceiver localReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String data = intent.getStringExtra("data");
        Toast.makeText(context, "Received: " + data, Toast.LENGTH_SHORT).show();
    }
};

3. 优化策略

  1. 避免耗时操作 :在 onReceive 中避免执行耗时操作,使用 IntentService 或者其他异步机制。
  2. 动态注册和取消注册:在合适的生命周期方法中注册和取消注册接收器,避免内存泄漏。
  3. 合理使用本地广播 :尽量使用 LocalBroadcastManager 进行应用内广播,避免不必要的跨进程通信。
  4. 权限管理:通过权限声明控制广播的发送和接收,确保安全性。
  5. 前台服务:在长时间运行的任务中使用前台服务,以减少服务被系统杀死的风险。

4. 总结

BroadcastReceiver 是 Android 应用程序中用于异步接收广播消息的重要组件。通过合理地使用系统广播、自定义广播、有序广播和本地广播,开发者可以实现松耦合的组件通信。与此同时,优化广播的处理流程和生命周期管理,能有效提升应用的性能和稳定性。了解和掌握 BroadcastReceiver 的高级使用和优化策略,是开发高效 Android 应用的重要技能。

|----------------------------------|
| 欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |

相关推荐
长亭外的少年6 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿9 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神10 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛10 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法11 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter12 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快13 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl13 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江13 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-14 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记