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

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

相关推荐
EQ-雪梨蛋花汤3 分钟前
【笔记】安卓毛玻璃效果(Blur)实现笔记(使用BlurView)(结尾附:源码)
android·笔记
StackNoOverflow2 小时前
MySQL Explain 返回列详解:从入门到实战,附 SQL 与避坑大全
android
CYRUS_STUDIO10 小时前
Frida 检测与对抗实战:进程、maps、线程、符号全特征清除
android·逆向
csj5012 小时前
安卓基础之《(28)—Service组件》
android
lhbian14 小时前
PHP、C++和C语言对比:哪个更适合你?
android·数据库·spring boot·mysql·kafka
catoop15 小时前
Android 最佳实践、分层架构与全流程解析(2025)
android
ZHANG13HAO15 小时前
Android 13 特权应用(Android Studio 开发)调用 AOSP 隐藏 API 完整教程
android·ide·android studio
田梓燊15 小时前
leetcode 142
android·java·leetcode
angerdream16 小时前
Android手把手编写儿童手机远程监控App之JAVA基础
android
菠萝地亚狂想曲16 小时前
Zephyr_01, environment
android·java·javascript