当前位置:   article > 正文

深入分析 Android BroadcastReceiver (五)

深入分析 Android BroadcastReceiver (五)

深入分析 Android BroadcastReceiver (五)

1. 广播机制的应用场景深入分析

1.1 应用场景1:实时系统事件监听

对于需要实时监控系统事件的应用,如电量监控应用、网络状态检测应用等,广播机制提供了灵活且高效的解决方案。这些应用通过注册相应的系统广播接收器,可以在事件发生时立即得到通知并采取相应的处理措施。

示例:电量状态变化监听

AndroidManifest.xml 中声明接收器:

<receiver android:name=".BatteryLevelReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_CHANGED"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5

接收器实现:

public class BatteryLevelReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        int batteryPct = (int) ((level / (float) scale) * 100);
        // 显示电量百分比
        Toast.makeText(context, "Battery level: " + batteryPct + "%", Toast.LENGTH_SHORT).show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
1.2 应用场景2:组件间通信

在大型应用中,不同组件之间需要进行通信。通过自定义广播,可以实现松耦合的组件通信,方便维护和扩展。

示例:应用模块间的数据传递

模块A发送广播:

Intent intent = new Intent("com.example.MODULE_A_ACTION");
intent.putExtra("data", "Sample data from Module A");
sendBroadcast(intent);
  • 1
  • 2
  • 3

模块B接收广播:

public class ModuleBReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String data = intent.getStringExtra("data");
        // 处理接收到的数据
        Toast.makeText(context, "Received from Module A: " + data, Toast.LENGTH_SHORT).show();
    }
}

// 在 Manifest 文件中声明接收器
<receiver android:name=".ModuleBReceiver">
    <intent-filter>
        <action android:name="com.example.MODULE_A_ACTION"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
1.3 应用场景3:有序广播的优先级处理

有序广播允许多个接收器按优先级顺序接收,并且可以中止广播的传播。适用于需要按优先级处理的场景,如日志系统、权限检查等。

示例:日志记录与权限检查

发送有序广播:

Intent intent = new Intent("com.example.ORDERED_ACTION");
sendOrderedBroadcast(intent, null);
  • 1
  • 2

高优先级接收器用于权限检查:

public class PermissionCheckReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 执行权限检查
        if (!hasPermission()) {
            // 没有权限,中止广播传播
            abortBroadcast();
        }
    }

    private boolean hasPermission() {
        // 模拟权限检查逻辑
        return false;
    }
}

// 在 Manifest 文件中声明接收器,并设置优先级
<receiver android:name=".PermissionCheckReceiver" android:priority="100">
    <intent-filter>
        <action android:name="com.example.ORDERED_ACTION"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

低优先级接收器用于日志记录:

public class LogReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 检查是否中止广播
        if (isOrderedBroadcast()) {
            // 广播未被中止,继续处理
            String log = "Received ordered broadcast: " + intent.getAction();
            Log.d("LogReceiver", log);
        }
    }
}

// 在 Manifest 文件中声明接收器,并设置优先级
<receiver android:name=".LogReceiver" android:priority="50">
    <intent-filter>
        <action android:name="com.example.ORDERED_ACTION"/>
    </intent-filter>
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
1.4 应用场景4:本地广播

本地广播用于应用内部组件之间的通信,避免跨进程通信的开销和安全隐患。

示例:内部通知更新

发送本地广播:

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent("com.example.LOCAL_UPDATE");
intent.putExtra("update", "New update available");
localBroadcastManager.sendBroadcast(intent);
  • 1
  • 2
  • 3
  • 4

接收本地广播:

@Override
protected void onStart() {
    super.onStart();
    IntentFilter filter = new IntentFilter("com.example.LOCAL_UPDATE");
    LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, filter);
}

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

private final BroadcastReceiver localReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String update = intent.getStringExtra("update");
        // 处理接收到的更新通知
        Toast.makeText(context, "Received local update: " + update, Toast.LENGTH_SHORT).show();
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2. 广播机制的最佳实践

在实际应用中,采用最佳实践可以提高广播机制的效率和安全性。

  1. 避免在主线程中执行耗时操作:广播接收器的 onReceive 方法是在主线程中执行的,应避免在其中进行耗时操作。对于需要执行的耗时任务,可以使用 IntentService 或者其他异步处理机制。

  2. 根据生命周期动态注册和取消注册接收器:在活动或服务的生命周期中,适时注册和取消注册接收器,避免内存泄漏和不必要的资源占用。

  3. 使用本地广播减少安全隐患:在应用内部进行组件通信时,优先使用 LocalBroadcastManager 发送和接收本地广播,减少不必要的跨进程通信。

  4. 通过权限管理提升安全性:为广播接收器声明合适的权限,确保只有授权的应用可以发送和接收特定的广播,从而提高安全性。

  5. 监控和优化性能:通过 Android Profiler 等性能监控工具,监控广播接收器的执行情况,及时优化耗时操作和资源占用。

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

在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/772842
推荐阅读
相关标签
  

闽ICP备14008679号