Android源码 --- BroadCast源码分析

本文详细分析了Android中BroadcastReceiver的源码,包括发送广播和注册接收广播的过程。发送广播分为普通广播和有序广播,有序广播会按优先级依次接收。关键源码涉及sendBroadcast在ContextImpl中的调用,最终由AMS处理并分发。注册接收广播主要是将信息保存到AMS列表中。整个广播流程从发送到分发,涉及多个关键方法的调用。
摘要由CSDN通过智能技术生成

BroadCastReciver 源码分析

上篇记录了activity启动流程的关键节点代码,本篇同样只是记录广播源码的关键节点代码

一、发送广播

broadCast 分为普通广播有序广播普通广播 发送后注册该广播的接收器都能接收到,而有序广播不同的是会根据接收器的优先级依次收到广播,并可中断广播继续向下发送

以下做了一个简单的脑图,做为流程图,可以大体看明白广播的传递流程

在这里插入图片描述

关键节点源码

sendBroadCast只是在Context中做了定义,而Context的实现类是Contextimpl,以下代码我们可以看到是直接将参数给到了AMS处理

    @Override
    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
   
        warnIfCallingFromSystemProcess();
        String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
        String[] receiverPermissions = receiverPermission == null ? null
                : new String[] {
   receiverPermission};
        try {
   
            intent.prepareToLeaveProcess(this);
            //调用AMS
            ActivityManager.getService().broadcastIntent(
                    mMainThread.getApplicationThread(), intent, resolvedType, null,
                    Activity.RESULT_OK, null, null, receiverPermissions, appOp, null, false, false,
                    getUserId());
        } catch (RemoteException e) {
   
            throw e.rethrowFromSystemServer();
        }
    } 

通过层层调用我们在方法broadcastIntentLocked中会看到以下关键代码:
在这里插入图片描述
其中 queue.enqueueParallelBroadcastLocked的实现,将该条记录存放到了列表中

    public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
   
        this.mParallelBroadcasts.add(r);
    }

scheduleBroadcastsLocked的实现,这里通过handler发送了一个消息

    public void scheduleBroadcastsLocked() {
   
        if (!this
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值