Activity创建流程
这次从Activity的handleLaunchActivity(...)方法开始分析,因为前面的流程已经在创建Application过程中讲过了。
从代码中我们可以看出Activity是通过performLauncherActivity(...)方法创建的。我们看下这个方法干了啥
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
...
ContextImpl appContext = createBaseContextForActivity(r);
Activity activity = null; try {
java.lang.ClassLoader cl = appContext.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
r.intent.prepareToEnterProcess(); if (r.state != null) {
r.state.setClassLoader(cl);
}
} catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to instantiate activity " + component+ ": " + e.toString(), e);
}
}
... if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
} if (!activity.mCalled) { throw new SuperNotCalledException( "Activity " + r.intent.getComponent().toShortString() + " did not call through to super.onCreate()");
}
r.activity = activity;
r.stopped = true; if (!r.activity.mFinished) {
activity.performStart();
r.stopped = false;
} if (!r.activity.mFinished) { if (r.isPersistable()) { if (r.state != null || r.persistentState != null) {
mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
r.persistentState);
}
} else if (r.state != null) {
mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
}
}
... return activity;
}从代码中我们可以看出:
首先创建了ContextImpl,然后通过Intrumentation的newActivity(...)来创建Activity的实例。
然后通过Intrumentation的callActivityOnCreate(...)来调用Activity的onCreate()方法
通过activity.performStart(...)来调用Activity的onStart()方法
如果上次Activity被异常杀死,则通过Intrumentation的callActivityOnRestoreInstanceState(...)来执行Activity的performRestoreInstanceState(...)方法
执行完成后则返回Activity实例并回到handleLaunchActivity(...)方法中,通过handleResumeActivity(...)方法来调用Activity的onResume方法。
以上就是Activity的创建流程.
Service创建流程
AMS完成AMS进程中的Service创建后,通过ApplitionThread的scheduleCreateService(...)方法来通过ActivityThread来创建Client端的Service。下面我们看下scheduleCreateService(...)的源码
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);
}scheduleCreateService(...)方法会发送CREATE_SERVICE给UI线程,下面看看UI线程的针对这个Message干了什么
public void handleMessage(Message msg) { if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what)); switch (msg.what) {
... case CREATE_SERVICE:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceCreate: " + String.valueOf(msg.obj)));
handleCreateService((CreateServiceData)msg.obj);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break;
...
}
}UI线程收到CREATE_SERVICE这个message后调用了handleCreateService(...)方法,接着看下handleCreateService(...)干了什么
private void handleCreateService(CreateServiceData data) {
...
LoadedApk loadedApk = getLoadedApkNoCheck(
data.info.applicationInfo, data.compatInfo);
Service service = null; try {
java.lang.ClassLoader cl = loadedApk.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, loadedApk);
context.setOuterContext(service);
Application app = loadedApk.makeApplication(false, mInstrumentation);
service.attach(context, this, data.info.name, data.token, app,
ActivityManager.getService());
service.onCreate();
mServices.put(data.token, service); try {
ActivityManager.getService().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);
}
}
}从源码中我们可以看出,首先通过ClassLoader来创建Service的实例。然后创建ContextImpl来让Service attach,由此可以证明,Service对应的mBase也为ContextImpl,然后直接调用Service的onCreate()。
作者:黑狗狗哥
链接:https://www.jianshu.com/p/0b82b7552d43
随时随地看视频