深入分析 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 分钟前
ConstraintLayout之layout_constraintDimensionRatio属性详解
android
百锦再1 小时前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗1 小时前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO2 小时前
Android APP 热修复原理
android·app·frida·hotfix·热修复
火柴就是我2 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade3 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下3 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
青春给了狗5 小时前
Android 14 系统统一修改app启动时图标大小和圆角
android
pengyu5 小时前
【Flutter 状态管理 - 柒】 | InheritedWidget:藏在组件树里的"魔法"✨
android·flutter·dart
居然是阿宋7 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin