【源码】bindService流程

bindService流程


ContextImpl

1、bindService

    @Override
    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
   
        warnIfCallingFromSystemProcess();
        return bindServiceCommon(service, conn, flags, null, mMainThread.getHandler(), null,
                getUser());
    }

2、bindServiceCommon

可以看到bind流程很像广播的注册流程,都是需要传入一个dispatcher(同时也很像Handler,因为Handler也是将自己传给Message,所以感觉很多源码的设计思想都是大同小异的)。
mPackageInfo是一个LoadedApk对象,通过getServiceDispatcher去创建一个ServiceDispatcher
和广播一样,IServiceConnectionInnerConnection的实现类,InnerConnectionServiceDispatcher的内部类,ServiceDispatcher持有ServiceConnectionContextHandler等对象,而InnerConnection这个Binder对象持有一个ServiceDispatcher的弱引用对象,也就是我们要传入给AMS的参数sd里面是持有了ServiceDispatcher内所有信息的。所以才能实现在连接完成之后回调到对应的onConnected

    @Override
    private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,
            String instanceName, Handler handler, Executor executor, UserHandle user) {
   
        IServiceConnection sd;

		...

        if (mPackageInfo != null) {
   
            if (executor != null) {
   
                sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), executor, flags);
            } else {
   
                sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);
            }
        }
        //不允许隐式绑定
        validateServiceIntent(service);
        try {
   
            IBinder token = getActivityToken();
            if (token == null && (flags&BIND_AUTO_CREATE) == 0 && mPackageInfo != null
                    && mPackageInfo.getApplicationInfo().targetSdkVersion
                    < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
   
                flags |= BIND_WAIVE_PRIORITY;
            }
            service.prepareToLeaveProcess(this);
            //调用AMS方法bindIsolatedService
            int res = ActivityManager.getService().bindIsolatedService(
                mMainThread.getApplicationThread(), getActivityToken(), service,
                service.resolveTypeIfNeeded(getContentResolver()),
                sd, flags, instanceName, getOpPackageName(), user.getIdentifier());
            ...
            return res != 0;
        } 
    }

AMS

1、bindIsolatedService

将逻辑交给ActiveService处理

    public int bindIsolatedService(...) {
   
        enforceNotIsolatedCaller("bindService");

        synchronized(this) {
   
            //调用ActiveService的方法
            return mServices.bindServiceLocked(...);
        }
    }

ActiveService

1、bindServiceLocked(重要)

这个方法比较重要,所以分成几块说明:

第一部分:

主要是初始化了一些变量,例如:ProcessRecordServiceRecordAppBindRecord以及ConnectionRecord,然后调用bringUpServiceLocked

  • 1、ServiceRecord:保存这个服务所有信息的记录。每一个应用程序进程绑定了一个Service组件之后,用来描述这个应用程序进程的一个PorcessRecord对象就会被保存在用来描述这个被绑定的Service组件的一个ServiceRecord对象的成员变量bingdings中。由于一个Service组件可能会被多个应用程序进程绑定,因此,用来描述这个Service组件的一个ServiceRecord对象就会使用一个IntentBindRecord对象来描述这些应用程序进程,并且以一个FilterComparison对象作为关键字保存在该ServiceRecord对象的成员变量bindings
  • 2、AppBindReco
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值