深入分析 Android BroadcastReceiver (二)

文章目录

    • [深入分析 Android BroadcastReceiver (二)](#深入分析 Android BroadcastReceiver (二))
    • [1. 深入理解 BroadcastReceiver 的高级使用和优化](#1. 深入理解 BroadcastReceiver 的高级使用和优化)
    • [2. 有序广播(Ordered Broadcasts)](#2. 有序广播(Ordered Broadcasts))
      • [2.1 实现有序广播](#2.1 实现有序广播)
    • [3. 粘性广播(Sticky Broadcasts)](#3. 粘性广播(Sticky Broadcasts))
      • [3.1 使用粘性广播](#3.1 使用粘性广播)
    • [4. 本地广播(LocalBroadcastManager)](#4. 本地广播(LocalBroadcastManager))
      • [4.1 使用本地广播](#4.1 使用本地广播)
    • [5. 安全性与权限管理](#5. 安全性与权限管理)
      • [5.1 声明权限](#5.1 声明权限)
    • [6. 性能优化](#6. 性能优化)
      • [6.1 避免耗时操作](#6.1 避免耗时操作)
      • [6.2 动态注册和取消注册](#6.2 动态注册和取消注册)
      • [6.3 使用本地广播](#6.3 使用本地广播)
    • [7. 实战示例](#7. 实战示例)
      • [7.1 本地广播接收器](#7.1 本地广播接收器)
      • [7.2 动态注册和取消注册](#7.2 动态注册和取消注册)
      • [7.3 有序广播接收器](#7.3 有序广播接收器)
      • [7.4 AndroidManifest.xml 中声明](#7.4 AndroidManifest.xml 中声明)
    • [8. 总结](#8. 总结)

深入分析 Android BroadcastReceiver (二)

1. 深入理解 BroadcastReceiver 的高级使用和优化

BroadcastReceiver 是 Android 中用于接收广播消息的重要组件。通过对 BroadcastReceiver 的高级使用和优化,开发者可以实现更加高效、灵活的应用逻辑。

2. 有序广播(Ordered Broadcasts)

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

2.1 实现有序广播

  1. 发送有序广播
java 复制代码
Intent intent = new Intent("com.example.ORDERED_ACTION");
sendOrderedBroadcast(intent, null);
  1. 接收有序广播

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

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

实现 BroadcastReceiver

java 复制代码
public class OrderedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理有序广播
        // 可以调用 abortBroadcast() 来中断广播
        abortBroadcast();
    }
}

3. 粘性广播(Sticky Broadcasts)

粘性广播已被弃用,但仍然可以在某些特定场景下使用。它允许广播在发送后被系统保留,后续接收器可以获取到最后一次的广播内容。

3.1 使用粘性广播

  1. 发送粘性广播
java 复制代码
Intent intent = new Intent("com.example.STICKY_ACTION");
sendStickyBroadcast(intent);
  1. 接收粘性广播

动态注册接收器来接收粘性广播。

java 复制代码
IntentFilter filter = new IntentFilter("com.example.STICKY_ACTION");
registerReceiver(stickyReceiver, filter);
  1. 清除粘性广播
java 复制代码
removeStickyBroadcast(intent);

4. 本地广播(LocalBroadcastManager)

本地广播是一种在应用内部发送广播的机制,避免跨进程通信的开销,同时增加安全性。

4.1 使用本地广播

  1. 发送本地广播
java 复制代码
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
Intent localIntent = new Intent("com.example.LOCAL_ACTION");
localBroadcastManager.sendBroadcast(localIntent);
  1. 接收本地广播
java 复制代码
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
BroadcastReceiver localReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理本地广播
    }
};
IntentFilter localFilter = new IntentFilter("com.example.LOCAL_ACTION");
localBroadcastManager.registerReceiver(localReceiver, localFilter);

5. 安全性与权限管理

为了提高安全性,广播接收器可以声明权限,以确保只有具有相应权限的应用程序才能发送或接收广播。

5.1 声明权限

在 AndroidManifest.xml 中声明接收器的权限:

xml 复制代码
<receiver android:name=".MyBroadcastReceiver" android:permission="com.example.MY_PERMISSION">
    <intent-filter>
        <action android:name="com.example.SENSITIVE_ACTION" />
    </intent-filter>
</receiver>

发送广播时指定权限:

java 复制代码
Intent intent = new Intent("com.example.SENSITIVE_ACTION");
sendBroadcast(intent, "com.example.MY_PERMISSION");

6. 性能优化

6.1 避免耗时操作

onReceive 方法中执行耗时操作会阻塞广播的处理,导致应用卡顿。可以通过启动 Service 或使用 AsyncTask 来处理耗时操作。

java 复制代码
@Override
public void onReceive(Context context, Intent intent) {
    Intent serviceIntent = new Intent(context, MyIntentService.class);
    context.startService(serviceIntent);
}

6.2 动态注册和取消注册

动态注册的 BroadcastReceiver 应在合适的生命周期方法中注册和取消注册,以避免内存泄漏和无用的广播接收。

java 复制代码
@Override
protected void onStart() {
    super.onStart();
    IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
    registerReceiver(myReceiver, filter);
}

@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(myReceiver);
}

6.3 使用本地广播

尽量使用 LocalBroadcastManager 发送和接收广播,减少跨进程通信的开销。

7. 实战示例

以下是一个综合示例,展示了如何使用本地广播、有序广播以及优化策略:

7.1 本地广播接收器

java 复制代码
public class LocalReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理本地广播
    }
}

7.2 动态注册和取消注册

java 复制代码
public class MainActivity extends AppCompatActivity {
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        localReceiver = new LocalReceiver();
    }

    @Override
    protected void onStart() {
        super.onStart();
        IntentFilter filter = new IntentFilter("com.example.LOCAL_ACTION");
        localBroadcastManager.registerReceiver(localReceiver, filter);
    }

    @Override
    protected void onStop() {
        super.onStop();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    private void sendLocalBroadcast() {
        Intent intent = new Intent("com.example.LOCAL_ACTION");
        localBroadcastManager.sendBroadcast(intent);
    }
}

7.3 有序广播接收器

java 复制代码
public class OrderedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理有序广播
    }
}

7.4 AndroidManifest.xml 中声明

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

8. 总结

BroadcastReceiver 是 Android 中处理广播消息的重要组件。通过合理使用本地广播、有序广播、粘性广播等高级特性,以及优化注册和处理过程,可以提高应用的性能和安全性。在实际项目中,开发者需要根据具体需求选择合适的广播机制,并遵循最佳实践以确保应用的稳定性和高效性。

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

相关推荐
阿巴斯甜16 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker17 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952718 小时前
Andorid Google 登录接入文档
android
黄林晴19 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android