bindService流程

概述:

1:binderService跳到AMS

2:AMS里面,bindService->ActivityService.bindServiceLocked:

binderService的时候有4种情况:

1)Service进程未被调起;

2)进程起来了,里面的service没有起来:realStartServiceLocked直接启动Service

3)进程起来了,Service也存在了,但是service没有被创建国;创建service:bringDownServiceLocked

4)进程起来了,Service也存在了,并且被绑定过,这是返回onRebind():requestServiceBindingLocked

在AMS里面的操作步骤,都是通过IApplicationThread回调到ActivityThread的handlerMessage里面进行创建服务等操作,并执行

onCreate、onBind等操作。

 

1:ContextImpl:

bindService->bindServiceCommon

 

2:通过以下跳转到AMS中:

 ActivityManagerService:bindService:

这里的synchronized,Activity里面连续绑定Service的时候,要同步执行。

ActivitySrevices:bindServiceLocked:

callerApp:判断调用进程是否还存在:

 

 执行到bringUpServiceLocked:

private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg, boolean whileRestarting, boolean permissionsReviewRequired) throws TransactionTooLargeException {
        if (r.app != null && r.app.thread != null) {
            this.sendServiceArgsLocked(r, execInFg, false);
            return null;
        } else if (!whileRestarting && r.restartDelay > 0L) {
            return null;
        } else {
            if (this.mRestartingServices.remove(r)) {
                r.resetRestartCounter();
                this.clearRestartingIfNeededLocked(r);
            }

            if (r.delayed) {
                this.getServiceMap(r.userId).mDelayedStartList.remove(r);
                r.delayed = false;
            }

            if (!this.mAm.mUserController.hasStartedUserState(r.userId)) {
                String msg = "Unable to launch app " + r.appInfo.packageName + "/" + r.appInfo.uid + " for service " + r.intent.getIntent() + ": user " + r.userId + " is stopped";
                Slog.w("ActivityManager", msg);
                this.bringDownServiceLocked(r);
                return msg;
            } else {
                try {
                    AppGlobals.getPackageManager().setPackageStoppedState(r.packageName, false, r.userId);
                } catch (RemoteException var10) {
                } catch (IllegalArgumentException var11) {
                    Slog.w("ActivityManager", "Failed trying to unstop package " + r.packageName + ": " + var11);
                }

                boolean isolated = (r.serviceInfo.flags & 2) != 0;
                String procName = r.processName;
                ProcessRecord app;
                if (!isolated) {
                    app = this.mAm.getProcessRecordLocked(procName, r.appInfo.uid, false);
            //表示进程存在,直接启动Service
if (app != null && app.thread != null) { try { app.addPackage(r.appInfo.packageName, r.appInfo.versionCode, this.mAm.mProcessStats); this.realStartServiceLocked(r, app, execInFg); return null; } catch (TransactionTooLargeException var12) { throw var12; } catch (RemoteException var13) { Slog.w("ActivityManager", "Exception when starting service " + r.shortName, var13); } } } else { app = r.isolatedProc; } if (app == null && !permissionsReviewRequired) {
            //app == null,说明进程不存在,先启动进程startProcessLocked
if ((app = this.mAm.startProcessLocked(procName, r.appInfo, true, intentFlags, "service", r.name, false, isolated, false)) == null) { String msg = "Unable to launch app " + r.appInfo.packageName + "/" + r.appInfo.uid + " for service " + r.intent.getIntent() + ": process is bad"; Slog.w("ActivityManager", msg);
              //创建完进程之后,再创建Service
this.bringDownServiceLocked(r); return msg; } if (isolated) { r.isolatedProc = app; } } if (!this.mPendingServices.contains(r)) { this.mPendingServices.add(r); } if (r.delayedStop) { r.delayedStop = false; if (r.startRequested) { this.stopServiceLocked(r); } } return null; } } }

 

回到bindServiceLocked:

 if (s.app != null && b.intent.received) {
                            try {
                                c.conn.connected(s.name, b.intent.binder);
                            } catch (Exception var29) {
                                Slog.w("ActivityManager", "Failure sending service " + s.shortName + " to connection " + c.conn.asBinder() + " (in " + c.binding.client.processName + ")", var29);
                            }
                //判断服务之前有没有被绑定过:b.intent.apps.size() == 1
                            if (b.intent.apps.size() == 1 && b.intent.doRebind) {
                                this.requestServiceBindingLocked(s, b.intent, callerFg, true);
                            }
                        } else if (!b.intent.requested) {
                //没有被绑定过
this.requestServiceBindingLocked(s, b.intent, callerFg, false); }

requestServiceBindingLocked:

private final boolean requestServiceBindingLocked(ServiceRecord r, IntentBindRecord i, boolean execInFg, boolean rebind) throws TransactionTooLargeException {
        if (r.app != null && r.app.thread != null) {
            if ((!i.requested || rebind) && i.apps.size() > 0) {
                boolean inDestroying;
                try {
                    this.bumpServiceExecutingLocked(r, execInFg, "bind");
                    r.app.forceProcessStateUpTo(10);
            //通过这里的thread,Thread是客户端传递到AMS的binder引用,作用就是跨进程通信,从AMS又回到了ActivityThread r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind, r.app.repProcState);
if (!rebind) { i.requested = true; } i.hasBound = true; i.doRebind = false; } catch (TransactionTooLargeException var7) { inDestroying = this.mDestroyingServices.contains(r); this.serviceDoneExecutingLocked(r, inDestroying, inDestroying); throw var7; } catch (RemoteException var8) { inDestroying = this.mDestroyingServices.contains(r); this.serviceDoneExecutingLocked(r, inDestroying, inDestroying); return false; } } return true; } else { return false; } }

ActivityThread->scheduleBindService:

public final void scheduleCreateService(IBinder token,
                ServiceInfo info, CompatibilityInfo compatInfo, int processState) {
            updateProcessState(processState, false);
            CreateServiceData s = new CreateServiceData();
            s.token = token;
            s.info = info;
            s.compatInfo = compatInfo;

            sendMessage(H.CREATE_SERVICE, s);
        }

ActivityThread:

case BIND_SERVICE:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");
                    handleBindService((BindServiceData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                    break;

handleBindService:

private void handleBindService(BindServiceData data) {
    //所有的服务创建出来的时候,都会保存到这里面,所以只会创建一次,Bind的时候去这里面取 Service s
= mServices.get(data.token); if (DEBUG_SERVICE) Slog.v(TAG, "handleBindService s=" + s + " rebind=" + data.rebind); if (s != null) { try { data.intent.setExtrasClassLoader(s.getClassLoader()); data.intent.prepareToEnterProcess(); try { if (!data.rebind) {
              //这个地方回调了Service的onBind IBinder binder
= s.onBind(data.intent); ActivityManagerNative.getDefault().publishService( data.token, data.intent, binder); } else { s.onRebind(data.intent); ActivityManagerNative.getDefault().serviceDoneExecuting( data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0); } ensureJitEnabled(); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } catch (Exception e) { if (!mInstrumentation.onException(s, e)) { throw new RuntimeException( "Unable to bind to service " + s + " with " + data.intent + ": " + e.toString(), e); } } } }
AMS:publishService

 这里的onConnectd就是回调到我们的客户端onServiceConnected

 

 

启动Service:

realStartServiceLocked:

 

ActivityThread:

 

ActivityThread

 

handleCreateService:

private void handleCreateService(CreateServiceData data) {
        // If we are getting ready to gc after going to the background, well
        // we are back active so skip it.
        unscheduleGcIdler();

        LoadedApk packageInfo = getPackageInfoNoCheck(
                data.info.applicationInfo, data.compatInfo);
        Service service = null;
        try {
            java.lang.ClassLoader cl = packageInfo.getClassLoader();
            service = (Service) cl.loadClass(data.info.name).newInstance();
        } catch (Exception e) {
            if (!mInstrumentation.onException(service, e)) {
                throw new RuntimeException(
                    "Unable to instantiate service " + data.info.name
                    + ": " + e.toString(), e);
            }
        }

        try {
            if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name);

            ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
            context.setOuterContext(service);

            Application app = packageInfo.makeApplication(false, mInstrumentation);
            service.attach(context, this, data.info.name, data.token, app,
                    ActivityManagerNative.getDefault());
       //回调Service的onCreate在这个地方 service.onCreate(); mServices.put(data.token, service);
try { ActivityManagerNative.getDefault().serviceDoneExecuting( data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } catch (Exception e) { if (!mInstrumentation.onException(service, e)) { throw new RuntimeException( "Unable to create service " + data.info.name + ": " + e.toString(), e); } } }

 

posted @ 2023-08-23 20:13  蜗牛攀爬  阅读(86)  评论(0编辑  收藏  举报