深入分析 Android BroadcastReceiver (八)

文章目录

    • [深入分析 Android BroadcastReceiver (八)](#深入分析 Android BroadcastReceiver (八))
    • [1. 系统与自定义实现](#1. 系统与自定义实现)
      • [1.1 系统广播机制](#1.1 系统广播机制)
        • [1.1.1 系统广播的实现原理](#1.1.1 系统广播的实现原理)
        • [1.1.2 系统广播的源码分析](#1.1.2 系统广播的源码分析)
      • [1.2 自定义广播机制](#1.2 自定义广播机制)
        • [1.2.1 自定义广播的实现步骤](#1.2.1 自定义广播的实现步骤)
        • [1.2.2 自定义广播的源码分析](#1.2.2 自定义广播的源码分析)
    • [2. 广播机制设计的初衷与优势](#2. 广播机制设计的初衷与优势)
      • [2.1 设计初衷](#2.1 设计初衷)
      • [2.2 优势](#2.2 优势)
    • [3. 总结](#3. 总结)

深入分析 Android BroadcastReceiver (八)

1. 系统与自定义实现

为了更全面地理解 Android 的广播机制,深入分析其底层实现原理和设计逻辑是非常重要的。这部分内容将探讨广播机制的系统实现以及自定义广播的内部工作机制。

1.1 系统广播机制

系统广播是 Android 操作系统中用于通知应用程序系统事件的重要机制。系统广播通常用于通知系统级别的事件,如网络变化、电量低、屏幕解锁等。

1.1.1 系统广播的实现原理

系统广播的实现主要涉及到 BroadcastReceiverIntentContextActivityManagerService (AMS) 等关键组件。以下是系统广播发送和接收的流程:

  1. 广播发送

应用或系统通过 Context.sendBroadcast() 方法发送广播。

java 复制代码
Intent intent = new Intent("com.example.SOME_ACTION");
context.sendBroadcast(intent);
  1. 广播注册

应用通过 Context.registerReceiver() 方法注册广播接收器。

java 复制代码
IntentFilter filter = new IntentFilter("com.example.SOME_ACTION");
context.registerReceiver(new MyReceiver(), filter);
  1. AMS 处理广播

广播发送后,ActivityManagerService (AMS) 负责广播的分发。AMS 会查找所有注册了相应广播的接收器,并将广播消息分发给这些接收器。

  1. 接收广播

注册的广播接收器通过 onReceive() 方法接收并处理广播。

java 复制代码
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理接收到的广播
    }
}
1.1.2 系统广播的源码分析

Intent.ACTION_BATTERY_LOW 为例,分析系统广播的源码:

  1. 广播发送

在系统检测到电量低时,会通过 BatteryService 发送电量低的广播:

java 复制代码
Intent intent = new Intent(Intent.ACTION_BATTERY_LOW);
mContext.sendBroadcast(intent);
  1. AMS 分发广播

ActivityManagerService 接收到广播请求后,通过内部的 BroadcastQueue 进行分发:

java 复制代码
void processNextBroadcastLocked(boolean fromMsg) {
    ...
    // 取出下一个广播
    BroadcastRecord r = mBroadcastQueue.dequeueBroadcastLocked(fromMsg);
    ...
    // 分发广播
    deliverToRegisteredReceiverLocked(receiver, info, r);
}
  1. 接收广播

应用注册的接收器接收到广播,并通过 onReceive() 方法处理:

java 复制代码
@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BATTERY_LOW.equals(intent.getAction())) {
        // 处理电量低的广播
    }
}

1.2 自定义广播机制

自定义广播是应用程序中用于组件间通信的重要手段,通常用于模块间的数据传递或事件通知。

1.2.1 自定义广播的实现步骤
  1. 定义广播意图

定义一个自定义广播的意图:

java 复制代码
Intent intent = new Intent("com.example.CUSTOM_ACTION");
intent.putExtra("data", "Sample data");
context.sendBroadcast(intent);
  1. 注册广播接收器

在应用中注册一个接收器来接收自定义广播:

java 复制代码
IntentFilter filter = new IntentFilter("com.example.CUSTOM_ACTION");
context.registerReceiver(new CustomReceiver(), filter);
  1. 接收广播并处理

自定义接收器实现 onReceive() 方法来处理广播:

java 复制代码
public class CustomReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("com.example.CUSTOM_ACTION".equals(intent.getAction())) {
            String data = intent.getStringExtra("data");
            // 处理接收到的广播数据
        }
    }
}
1.2.2 自定义广播的源码分析

自定义广播的处理机制与系统广播类似,主要区别在于广播的定义和注册过程由开发者自行控制。

  1. 发送广播

自定义广播的发送通过 Context.sendBroadcast() 方法:

java 复制代码
Intent intent = new Intent("com.example.CUSTOM_ACTION");
context.sendBroadcast(intent);
  1. AMS 处理广播

自定义广播也会通过 AMS 进行分发,分发机制与系统广播一致。AMS 会根据注册的接收器列表,将广播消息分发到对应的接收器。

  1. 接收广播

注册的接收器接收并处理广播:

java 复制代码
@Override
public void onReceive(Context context, Intent intent) {
    if ("com.example.CUSTOM_ACTION".equals(intent.getAction())) {
        String data = intent.getStringExtra("data");
        // 处理广播数据
    }
}

2. 广播机制设计的初衷与优势

2.1 设计初衷

  1. 解耦组件

广播机制的设计初衷之一是解耦应用程序中的各个组件,使得组件之间的通信更加灵活和松散耦合。通过广播,组件不需要直接引用对方,而是通过广播消息进行通信,从而降低了组件间的依赖性。

  1. 异步通信

广播机制提供了一种异步通信的方式,使得消息的发送和接收可以在不同的线程中进行,不会阻塞主线程,从而提高了应用的响应速度和用户体验。

  1. 系统事件通知

广播机制允许系统向应用程序通知各种系统事件(如网络变化、电池状态等),使得应用程序可以对系统状态的变化做出响应,从而提升了应用的智能化和用户体验。

2.2 优势

  1. 松散耦合

广播机制通过事件驱动的方式进行组件间通信,实现了松散耦合,使得组件之间的依赖关系减少,提升了代码的可维护性和可扩展性。

  1. 灵活性

广播机制支持动态注册和静态注册,提供了极大的灵活性。应用可以根据需要在运行时动态注册广播接收器,也可以通过 Manifest 文件静态注册接收器。

  1. 全局通信

广播机制支持全局范围内的通信,系统广播可以被任何应用接收,自定义广播可以在应用内部进行全局通信,适用于需要全局通知的场景。

3. 总结

广播机制是 Android 中重要的异步通信方式,通过系统广播和自定义广播,实现了应用程序内外部的松散耦合和灵活通信。在实际开发中,开发者应结合具体需求,选择合适的广播机制,并遵循最佳实践,以提升应用的性能和安全性。

  • 系统广播:用于通知应用程序系统级别的事件,通过 AMS 进行广播分发。
  • 自定义广播:用于应用内部组件间的通信,通过自定义意图进行广播发送和接收。
  • 安全与性能优化:通过设置权限、使用 LocalBroadcastManager 以及合理管理广播接收器的生命周期,提升应用的安全性和性能。

通过深入理解广播机制的实现原理和设计逻辑,开发者可以更加高效地利用广播机制进行应用开发,构建高质量的 Android 应用。

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

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui