万万哇 发表于 2024-7-11 14:16:25

深入分析 Android BroadcastReceiver (八)

深入分析 Android BroadcastReceiver (八)

1. 体系与自界说实现

为了更全面地明白 Android 的广播机制,深入分析其底层实现原理和操持逻辑黑白常紧张的。这部分内容将探讨广播机制的体系实现以及自界说广播的内部工作机制。
1.1 体系广播机制

体系广播是 Android 操作体系中用于关照应用程序体系事件的紧张机制。体系广播通常用于关照体系级别的事件,如网络变革、电量低、屏幕解锁等。
1.1.1 体系广播的实现原理

体系广播的实现主要涉及到 BroadcastReceiver、Intent、Context 和 ActivityManagerService (AMS) 等关键组件。以下是体系广播发送和吸收的流程:

[*]广播发送
应用或体系通过 Context.sendBroadcast() 方法发送广播。
Intent intent = new Intent("com.example.SOME_ACTION");
context.sendBroadcast(intent);

[*]广播注册
应用通过 Context.registerReceiver() 方法注册广播吸收器。
IntentFilter filter = new IntentFilter("com.example.SOME_ACTION");
context.registerReceiver(new MyReceiver(), filter);

[*]AMS 处理广播
广播发送后,ActivityManagerService (AMS) 负责广播的分发。AMS 会查找全部注册了相应广播的吸收器,并将广播消息分发给这些吸收器。

[*]吸收广播
注册的广播吸收器通过 onReceive() 方法吸收并处理广播。
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      // 处理接收到的广播
    }
}
1.1.2 体系广播的源码分析

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

[*]广播发送
在体系检测到电量低时,会通过 BatteryService 发送电量低的广播:
Intent intent = new Intent(Intent.ACTION_BATTERY_LOW);
mContext.sendBroadcast(intent);

[*]AMS 分发广播
ActivityManagerService 吸收到广播请求后,通过内部的 BroadcastQueue 举行分发:
void processNextBroadcastLocked(boolean fromMsg) {
    ...
    // 取出下一个广播
    BroadcastRecord r = mBroadcastQueue.dequeueBroadcastLocked(fromMsg);
    ...
    // 分发广播
    deliverToRegisteredReceiverLocked(receiver, info, r);
}

[*]吸收广播
应用注册的吸收器吸收到广播,并通过 onReceive() 方法处理:
@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BATTERY_LOW.equals(intent.getAction())) {
      // 处理电量低的广播
    }
}
1.2 自界说广播机制

自界说广播是应用程序中用于组件间通讯的紧张手段,通常用于模块间的数据传递或事件关照。
1.2.1 自界说广播的实现步调


[*]界说广播意图
界说一个自界说广播的意图:
Intent intent = new Intent("com.example.CUSTOM_ACTION");
intent.putExtra("data", "Sample data");
context.sendBroadcast(intent);

[*]注册广播吸收器
在应用中注册一个吸收器来吸收自界说广播:
IntentFilter filter = new IntentFilter("com.example.CUSTOM_ACTION");
context.registerReceiver(new CustomReceiver(), filter);

[*]吸收广播并处理
自界说吸收器实现 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 自界说广播的源码分析

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

[*]发送广播
自界说广播的发送通过 Context.sendBroadcast() 方法:
Intent intent = new Intent("com.example.CUSTOM_ACTION");
context.sendBroadcast(intent);

[*]AMS 处理广播
自界说广播也会通过 AMS 举行分发,分发机制与体系广播一致。AMS 会根据注册的吸收器列表,将广播消息分发到对应的吸收器。

[*]吸收广播
注册的吸收器吸收并处理广播:
@Override
public void onReceive(Context context, Intent intent) {
    if ("com.example.CUSTOM_ACTION".equals(intent.getAction())) {
      String data = intent.getStringExtra("data");
      // 处理广播数据
    }
}
2. 广播机制操持的初衷与优势

2.1 操持初衷


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

[*]异步通讯
广播机制提供了一种异步通讯的方式,使得消息的发送和吸收可以在不同的线程中举行,不会壅闭主线程,从而提高了应用的响应速度和用户体验。

[*]体系事件关照
广播机制答应体系向应用程序关照各种体系事件(如网络变革、电池状态等),使得应用程序可以对体系状态的变革做出响应,从而提升了应用的智能化和用户体验。
2.2 优势


[*]松散耦合
广播机制通过事件驱动的方式举行组件间通讯,实现了松散耦合,使得组件之间的依赖关系淘汰,提升了代码的可维护性和可扩展性。

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

[*]全局通讯
广播机制支持全局范围内的通讯,体系广播可以被任何应用吸收,自界说广播可以在应用内部举行全局通讯,适用于需要全局关照的场景。
3. 总结

广播机制是 Android 中紧张的异步通讯方式,通过体系广播和自界说广播,实现了应用程序内外部的松散耦合和灵活通讯。在实际开发中,开发者应联合详细需求,选择合适的广播机制,并遵照最佳实践,以提升应用的性能和安全性。


[*]体系广播:用于关照应用程序体系级别的事件,通过 AMS 举行广播分发。
[*]自界说广播:用于应用内部组件间的通讯,通过自界说意图举行广播发送和吸收。
[*]安全与性能优化:通过设置权限、使用 LocalBroadcastManager 以及公道管理广播吸收器的生命周期,提升应用的安全性和性能。
通过深入明白广播机制的实现原理和操持逻辑,开发者可以更加高效地使用广播机制举行应用开发,构建高质量的 Android 应用。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 https://img-blog.csdnimg.cn/direct/831c93e23df14cb7a64408f00820dc3e.png#pic_center

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 深入分析 Android BroadcastReceiver (八)