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); } } }