深入分析 Android BroadcastReceiver (八)
创始人
2024-11-15 20:11:53
0

文章目录

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

深入分析 Android BroadcastReceiver (八)

1. 系统与自定义实现

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

1.1 系统广播机制

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

1.1.1 系统广播的实现原理

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

  1. 广播发送

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

Intent intent = new Intent("com.example.SOME_ACTION"); context.sendBroadcast(intent); 
  1. 广播注册

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

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

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

  1. 接收广播

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

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

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

  1. 广播发送

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

Intent intent = new Intent(Intent.ACTION_BATTERY_LOW); mContext.sendBroadcast(intent); 
  1. AMS 分发广播

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

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

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

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

1.2 自定义广播机制

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

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

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

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

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

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

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

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() 方法:

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

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

  1. 接收广播

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

@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 应用。

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

在这里插入图片描述

相关内容

热门资讯

PyTorch深度学习-06逻... “梦想成真之前,看上去总是那么遥不可及”博主主页:@璞玉牧之本文...
微调llama 3 — PEF... 1. llama 3 微调基础1.1 llama 3 简介官方blog llama 3 目前有两个版...
AI 教母对话 ChatGPT... 作者 | 王启隆出品 | AI 科技大本营(ID:rgznai100&#...
2024年Midjourney... 1.Midjourney介绍Midjourney 是一款备受欢迎的人工智能生成图像工具,...
Stable Diffusio... 文章目录艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时...
探索无限创意:ChatGPT ... 探索无限创意:ChatGPT Midjourney Prompt Generator在...
AIGC系列之:Control... 《Adding Conditional Control to Text-to-Image Diffu...
文心一言Plugin实战来了,... 刚刚过去的8月,百度WAVE SUMMIT 深度学习开发者大会上,重磅发...
语音识别模型whisper的参... 一、whisper简介:Whisper是一种通用的语音识别模型。它是在各种音频的大型数...
文心一言4.0、智谱清言、Mo... 前言前两天看到这张图,又刚好拿到了文心一言的4.0内测号,就想着把新版国...