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

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

相关推荐
长亭外的少年6 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿8 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神10 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛10 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法10 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter11 小时前
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-13 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记