剖析ActivityManagerService源码,了解广播接收和发送机制

本文探讨了Android广播机制,重点关注ActivityManagerService在广播接收器注册过程中的作用。通过对ActivityManagerProxy和Binder机制的分析,揭示了客户端如何通过mRemote与服务端交互,最终在AMS内部实现接收器的注册。AMS的registerReceiver方法是关键,它实现了接收器与过滤器的对应,遵循订阅者模式。
摘要由CSDN通过智能技术生成

1.简介

“在安卓的广播机制中,用户自定义的Activity或自定义的子类BroadcastReceiver扮演着接收器的角色,Activity本身以及各类系统事件(如有电话拨入)也可以扮演广播发出者的角色。而其中,Android的Activity Manager Service无疑扮演着核心角色。总体上,安卓的广播采用的是订阅者、发布者的设计模式。”       

                                                                     ---来自本人上一篇博客《对Android广播接收与发出机制的一些AMS以外的源码分析》

上一节,我们在AMS以外的部分,描述了广播接收和发送机制的原理,主要是一些初始化操作,今天我们在AMS内部观察注册广播接收器机制的原理。

2.注册广播接收器

我们先从上一篇博客的内容开始回顾。注册者线程的最后几步先是1.寻找ActivityManagerService的本地代理对象,即ActivityManagerProxy。这部分代码为:

class ContextImpl extends Context {  
    ......  
  
    @Override  
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {  
        return registerReceiver(receiver, filter, null, null);  
    }  
  
    @Override  
    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,  
            String broadcastPermission, Handler scheduler) {  
        return registerReceiverInternal(receiver, filter, broadcastPermission,  
            scheduler, getOuterContext());  
    }  
  
    private Intent registerReceiverInternal(BroadcastReceiver receiver,  
            IntentFilter filter, String broadcastPermission,  
            Handler scheduler, Context context) {  
        IIntentReceiver rd = null;  
        if (receiver != null) {  
            if (mPackageInfo != null && context != null) {  
                if (scheduler == null) {  
                    scheduler = mMainThread.getHandler();  
                }  
                rd = mPackageInfo.getReceiverDispatcher(  
                    receiver, context, scheduler,  
                    mMainThread.getInstrumentation(), true);  
            } else {  
                ......  
            }  
        }  
        try {  
            //这个ActivityManagerNative.getDefault(),就是事先填充的代理对象,具体大家可以参照源码研究
            return ActivityManagerNative.getDefault().registerReceiver(  
                    mMainThread.getApplicationThread(),  
                    rd, filter, broadcastPermission);  
        } catch (RemoteException e) {  
                return null;  
        }  
    }  
  
    ......  
  
}  


然后在ActivityManagerProxy中,使用binder机制,通过调用,mRemote.transact()方法,将数据传送给ActivityManagerService进程,至此进入ActivityManagerService内部。具体看以下代码:

public Intent registerReceiver(IApplicationThread caller, String packageName,
            IIntentReceiver receiver,
            IntentFilter filter, String perm, int userId) throws RemoteException
    {
        //这部分是向Parcel填充数据
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManage
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值