前言
从一个App的角度来看,应用启动很简单,只用调用一下Activity中的startActivity方法就行了.但是背后
发生了什么?我想不管是一个App开发者还是FW开发者都应该掌握的.
我把这部分大致分为两个部分.
1. 开启Activity
2. 创建新的进程
1.1 涉及到的类
ActivityThread : 主要的App入口,一个应用的主线程
ApplicationThread : 代理类,继承了aidl接口, 在ActivityThread成员变量中创建
Instrumentation : 负责发起Activity的启动、并具体负责Activity的创建以及Activity生命周期的回调
一个应用里面只有一个Instrumentation对象,并且这个对象是在ActivityThread中创建的
ActivityManagerService :管理所有Activity, 并且Acivity通过binder跨进程发送信息给
AMS,然后AMS通过Socket来创建进程.
ActivityStack : Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等通
过ActivityStack决定是否需要启动新的进程。
ActivityRecord:ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,
来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像
1.2 startActivity
在Activity中调用startActivity最终会调用到startActivityForResult
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
//没有设置父的Activity
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar =
//开启execStartActivity,mMainThread创建进程的时候的
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
// the activity visible until the result is received. Setting
// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
// activity hidden during this time, to avoid flickering.
// This can only be done when a result is requested because
// that guarantees we will get information back when the
// activity is finished, no matter what happens to it.
mStartedActivity = true;
}
cancelInputsAndStartExitTransition(options);
// TODO Consider clearing/flushing other event sources and events for child windows.
} else {
if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
// Note we want to go through this method for compatibility with
// existing applications that may have overridden it.
mParent.startActivityFromChild(this, intent, requestCode);
}
}
}
接着调用 execStartActivity
public ActivityResult execStartActivity(
1636 Context who, IBinder contextThread, IBinder token, Activity target,
1637 Intent intent, int requestCode, Bundle options) {
1638 .......................
1665 try {
1666 intent.migrateExtraStreamToClipData();
1667 intent.prepareToLeaveProcess(who);
//通过binder获取AMS,实际上是调用的AMS中的startActivity
1668 int result = ActivityManager.getService()
1669 .startActivity(whoThread, who.getBasePackageName(), intent,
1670 intent.resolveTypeIfNeeded(who.getContentResolver()),
1671 token, target != null ? target.mEmbeddedID : null,
1672 requestCode, 0, null, options);
1673 checkStartActivityResult(result, intent);
1674 } catch (RemoteException e) {
1675 throw new RuntimeException("Failure from system", e);
1676 }
1677 return null;
........................
1678 }
1679
可以看下ActivityManager.getService()实现
/**
4123 * @hide
4124 */
4125 public static IActivityManager getService() {
4126 return IActivityManagerSingleton.get();
4127 }
4128
4129 private static final Singleton<IActivityManager> IActivityManagerSingleton =
4130 new Singleton<IActivityManager>() {
4131 @Override
4132 protected IActivityManager create() {
4133 final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
//就是AMS的binder接口
4134 final IActivityManager am = IActivityManager.Stub.asInterface(b);
4135 return am;
4136 }
4137 };
在AMS里面调用startActivity方法:
@Override
5079 public final int startActivity(IApplicationThread caller, String callingPackage,
5080 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
5081 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
5082 return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
5083 resultWho, requestCode, startFlags, profilerInfo, bOptions,
5084 UserHandle.getCallingUserId());
5085 }
这个地方其实和8.0的代码差别还是挺大的.mActivityStartController这个地方做了一个封装,运用建造者模式.
看来设计模式还要好好学学呀。源码中处处有设计模式的思想
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
5097 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
5098 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
5099 boolean validateIncomingUser) {
5100 enforceNotIsolatedCaller("startActivity");
5101
5102 userId = mActivityStartController.checkTargetUser(userId, validateIncomingUser,
5103 Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
5104
5105 // TODO: Switch to user app stacks here.
5106 return mActivityStartController.obtainStarter(intent, "startActivityAsUser")
5107 .setCaller(caller)
5108 .setCallingPackage(callingPackage)
5109 .setResolvedType(resolvedType)
5110 .setResultTo(resultTo)
5111 .setResultWho(resultWho)
5112 .setRequestCode(requestCode)
5113 .setStartFlags(startFlags)
5114 .setProfilerInfo(profilerInfo)
5115 .setActivityOptions(bOptions)
5116 .setMayWait(userId)
5117 .execute();
5118
5119 }
5120
接着查看mActivityStartController类里面的obtainStarter方法
我就把这些全部都拿过来了.从代码里面看,构造函数里面传进了DefaultFactory.那接着查看DefaultFactory
在哪里创建。
ActivityStartController(ActivityManagerService service) {
115 this(service, service.mStackSupervisor,
116 new DefaultFactory(service, service.mStackSupervisor,
117 new ActivityStartInterceptor(service, service.mStackSupervisor)));
118 }
119
120 @VisibleForTesting
121 ActivityStartController(ActivityManagerService service, ActivityStackSupervisor supervisor,
122 Factory factory) {
123 mService = service;
124 mSupervisor = supervisor;
125 mHandler = new StartHandler(mService.mHandlerThread.getLooper());
126 mFactory = factory;
127 mFactory.setController(this);
128 mPendingRemoteAnimationRegistry = new PendingRemoteAnimationRegistry(service,
129 service.mHandler);
130 }
131
132 /**
133 * @return A starter to configure and execute starting an activity. It is valid until after
134 * {@link ActivityStarter#execute} is invoked. At that point, the starter should be
135 * considered invalid and no longer modified or used.
136 */
137 ActivityStarter obtainStarter(Intent intent, String reason) {
138 return mFactory.obtain().setIntent(intent).setReason(reason);
139 }
140
在ActivityStarter里面定义了DefaultFactory,其实就是调用ActivityStarter的execute()方法
static class DefaultFactory implements Factory {
227 /**
228 * The maximum count of starters that should be active at one time:
229 * 1. last ran starter (for logging and post activity processing)
230 * 2. current running starter
231 * 3. starter from re-entry in (2)
232 */
233 private final int MAX_STARTER_COUNT = 3;
234
235 private ActivityStartController mController;
236 private ActivityManagerService mService;
237 private ActivityStackSupervisor mSupervisor;
238 private ActivityStartInterceptor mInterceptor;
239
240 private SynchronizedPool<ActivityStarter> mStarterPool =
241 new SynchronizedPool<>(MAX_STARTER_COUNT);
242
243 DefaultFactory(ActivityManagerService service,
244 ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {
245 mService = service;
246 mSupervisor = supervisor;
247 mInterceptor = interceptor;
248 }
249
250 @Override
251 public void setController(ActivityStartController controller) {
252 mController = controller;
253 }
254
255 @Override
256 public ActivityStarter obtain() {
257 ActivityStarter starter = mStarterPool.acquire();
258
259 if (starter == null) {
260 starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
261 }
262
263 return starter;
264 }
265
266 @Override
267 public void recycle(ActivityStarter starter) {
268 starter.reset(true /* clearRequest*/);
269 mStarterPool.release(starter);
270 }
271 }
最终调用到的是ActivityStarter的execute方法. 这里我就省略一下了
private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,
1194 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
1195 int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
1196 ActivityRecord[] outActivity) {
1197
1199 mService.mWindowManager.deferSurfaceLayout();
1200 result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
1201 startFlags, doResume, options, inTask, outActivity);
1202
1213
1214 postStartActivityProcessing(r, result, mTargetStack);
1215
1216 return result;
1217 }
接着调用ActivityStarter的startActivityUnchecked方法
private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
1221 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
1222 int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,
1223 ActivityRecord[] outActivity) {
1224
1225 setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession,
1226 voiceInteractor);
1227
1228 computeLaunchingTaskFlags();
1229
1230 computeSourceStack();
mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
mSupervisor.resumeFocusedStackTopActivityLocked();
1231}
boolean resumeFocusedStackTopActivityLocked(
2215 ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
2216
2217 if (!readyToResume()) {
2218 return false;
2219 }
2220
2221 if (targetStack != null && isFocusedStack(targetStack)) {
2222 return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
2223 }
2224
2225 final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
2226 if (r == null || !r.isState(RESUMED)) {
//调用ActivityStack.java的resumeTopActivityUncheckedLocked
2227 mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
2228 } else if (r.isState(RESUMED)) {
2229 // Kick off any lingering app transitions form the MoveTaskToFront operation.
2230 mFocusedStack.executeAppTransition(targetOptions);
2231 }
2232
2233 return false;
2234 }
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
2283 if (mStackSupervisor.inResumeTopActivity) {
2284 // Don't even start recursing.
2285 return false;
2286 }
2287
2288 boolean result = false;
2289 try {
2290 // Protect against recursion.
2291 mStackSupervisor.inResumeTopActivity = true;
//自身的resumeTopActivityInnerLocked方法啊
2292 result = resumeTopActivityInnerLocked(prev, options);
2293
2294 // When resuming the top activity, it may be necessary to pause the top activity (for
2295 // example, returning to the lock screen. We suppress the normal pause logic in
2296 // {@link #resumeTopActivityUncheckedLocked}, since the top activity is resumed at the
2297 // end. We call the {@link ActivityStackSupervisor#checkReadyForSleepLocked} again here
2298 // to ensure any necessary pause logic occurs. In the case where the Activity will be
2299 // shown regardless of the lock screen, the call to
2300 // {@link ActivityStackSupervisor#checkReadyForSleepLocked} is skipped.
2301 final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
2302 if (next == null || !next.canTurnScreenOn()) {
2303 checkReadyForSleep();
2304 }
2305 } finally {
2306 mStackSupervisor.inResumeTopActivity = false;
2307 }
2308
2309 return result;
2310 }
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
if (mResumedActivity != null) {
2443 if (DEBUG_STATES) Slog.d(TAG_STATES,
2444 "resumeTopActivityLocked: Pausing " + mResumedActivity);
//当前的Activiyt肯定执行了resume,所以先调用了自己的onPause方法,通过IPC通信
2445 pausing |= startPausingLocked(userLeaving, false, next, false);
2446 }
mStackSupervisor.startSpecificActivityLocked(next, true, true);
}
这个地方要注意, 如果这个进程没有启动过,
# com.android.server.am.ActivityStackSupervisor
void startSpecificActivityLocked(ActivityRecord r,
boolean andResume, boolean checkConfig) {
...
//这个地方取出来的为null,所以肯定会先创建进程
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
1682 r.info.applicationInfo.uid, true);
1683
if (app != null && app.thread != null) {
try {
...
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
...
}
}
//去创建进程,这个在下面一章讲解
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
上面的startProcessLocked会通过ActivityThread这个类创建一个进程,这个会在下面一个章节中讲解
这个地方先记着,会调用到ActivityThread的main函数.创建一个新进程
public static void main(String[] args) {
6624 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
6625
6626 // CloseGuard defaults to true and can be quite spammy. We
6627 // disable it here, but selectively enable it later (via
6628 // StrictMode) on debug builds, but using DropBox, not logs.
6629 CloseGuard.setEnabled(false);
6630
6631 Environment.initForCurrentUser();
6632
6633 // Set the reporter for event logging in libcore
6634 EventLogger.setReporter(new EventLoggingReporter());
6635
6636 // Make sure TrustedCertificateStore looks in the right place for CA certificates
6637 final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
6638 TrustedCertificateStore.setDefaultUserDirectory(configDir);
6639
6640 Process.setArgV0("<pre-initialized>");
6641
6642 Looper.prepareMainLooper();
6643
6644 // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
6645 // It will be in the format "seq=114"
6646 long startSeq = 0;
6647 if (args != null) {
6648 for (int i = args.length - 1; i >= 0; --i) {
6649 if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
6650 startSeq = Long.parseLong(
6651 args[i].substring(PROC_START_SEQ_IDENT.length()));
6652 }
6653 }
6654 }
//创建ActivityThread对象,
6655 ActivityThread thread = new ActivityThread();
6656 thread.attach(false, startSeq);
6657
6658 if (sMainThreadHandler == null) {
6659 sMainThreadHandler = thread.getHandler();
6660 }
6661
6662 if (false) {
6663 Looper.myLooper().setMessageLogging(new
6664 LogPrinter(Log.DEBUG, "ActivityThread"));
6665 }
6666
6667 // End of event ActivityThreadMain.
6668 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
//开启looper循环,确保进程不退出
6669 Looper.loop();
6670
6671 throw new RuntimeException("Main thread loop unexpectedly exited");
6672 }
6673
函数attach最终调用了ActivityManagerService的远程接口ActivityManagerProxy的attachApplication函数,
传入的参数是mAppThread,这是一个ApplicationThread类型的Binder对象,它的作用是用来进行进程间通信的。
private void attach(boolean system, long startSeq) {
6479 sCurrentActivityThread = this;
6480 mSystemThread = system;
6481 if (!system) {
6482 ViewRootImpl.addFirstDrawHandler(new Runnable() {
6483 @Override
6484 public void run() {
6485 ensureJitEnabled();
6486 }
6487 });
6488 android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
6489 UserHandle.myUserId());
6490 RuntimeInit.setApplicationObject(mAppThread.asBinder());
//获取到AMS对象
6491 final IActivityManager mgr = ActivityManager.getService();
6492 try {
//这个地方回调到AMS里面的attachApplication方法
6493 mgr.attachApplication(mAppThread, startSeq);
6494 } catch (RemoteException ex) {
6495 throw ex.rethrowFromSystemServer();
6496 }
6497 // Watch for getting close to heap limit.
6498 BinderInternal.addGcWatcher(new Runnable() {
6499 @Override public void run() {
6500 if (!mSomeActivitiesChanged) {
6501 return;
6502 }
6503 Runtime runtime = Runtime.getRuntime();
6504 long dalvikMax = runtime.maxMemory();
6505 long dalvikUsed = runtime.totalMemory() - runtime.freeMemory();
6506 if (dalvikUsed > ((3*dalvikMax)/4)) {
6507 if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024)
6508 + " total=" + (runtime.totalMemory()/1024)
6509 + " used=" + (dalvikUsed/1024));
6510 mSomeActivitiesChanged = false;
6511 try {
6512 mgr.releaseSomeActivities(mAppThread);
6513 } catch (RemoteException e) {
6514 throw e.rethrowFromSystemServer();
6515 }
6516 }
6517 }
6518 });
上面获取到AMS并且调用到AMS里面的attachApplication方法, 接着调用AMS里面的attachApplicationLocked方法,
private final boolean attachApplicationLocked(IApplicationThread thread,
7573 int pid, int callingUid, long startSeq) {
// See if the top visible activity is waiting to run in this process...
7867 if (normalMode) {
7868 try {
//调用ActivityStackSupervisor.java里面的attachApplicationLocked方法
7869 if (mStackSupervisor.attachApplicationLocked(app)) {
7870 didSomething = true;
7871 }
7872 } catch (Exception e) {
7873 Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
7874 badApp = true;
7875 }
7876 }
}
ActivityStackSupervisor类里面的attachApplicationLocked方法
boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
972 final String processName = app.processName;
973 boolean didSomething = false;
974 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
975 final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
976 for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
977 final ActivityStack stack = display.getChildAt(stackNdx);
978 if (!isFocusedStack(stack)) {
979 continue;
980 }
981 stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);
982 final ActivityRecord top = stack.topRunningActivityLocked();
983 final int size = mTmpActivityList.size();
984 for (int i = 0; i < size; i++) {
985 final ActivityRecord activity = mTmpActivityList.get(i);
986 if (activity.app == null && app.uid == activity.info.applicationInfo.uid
987 && processName.equals(activity.processName)) {
988 try {
// startActivity
989 if (realStartActivityLocked(activity, app,
990 top == activity /* andResume */, true /* checkConfig */)) {
991 didSomething = true;
992 }
993 } catch (RemoteException e) {
994 Slog.w(TAG, "Exception in new application when starting activity "
995 + top.intent.getComponent().flattenToShortString(), e);
996 throw e;
997 }
998 }
999 }
1000 }
1001 }
1002 if (!didSomething) {
1003 ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
1004 }
1005 return didSomething;
1006 }
通过realStartActivityLocked方法来调用scheduleTransaction方法
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
1378 boolean andResume, boolean checkConfig) throws RemoteException {
// Create activity launch transaction.
1523 final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
1524 r.appToken);
1525 clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
1526 System.identityHashCode(r), r.info,
1527 // TODO: Have this take the merged configuration instead of separate global
1528 // and override configs.
1529 mergedConfiguration.getGlobalConfiguration(),
1530 mergedConfiguration.getOverrideConfiguration(), r.compat,
1531 r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
1532 r.persistentState, results, newIntents, mService.isNextTransitionForward(),
1533 profilerInfo));
1534
1535 // Set desired final state.
1536 final ActivityLifecycleItem lifecycleItem;
1537 if (andResume) {
1538 lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
1539 } else {
1540 lifecycleItem = PauseActivityItem.obtain();
1541 }
1542 clientTransaction.setLifecycleStateRequest(lifecycleItem);
1543
1544 // Schedule transaction.//在9.0上面这个地方重构了全部转化为Transaction一类的方法来
// 调用launch
1545 mService.getLifecycleManager().scheduleTransaction(clientTransaction);
}
调用ClientLifecycleManager 里面的scheduleTransaction方法
void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
46 final IApplicationThread client = transaction.getClient();
47 transaction.schedule();
48 if (!(client instanceof Binder)) {
49 // If client is not an instance of Binder - it's a remote call and at this point it is
50 // safe to recycle the object. All objects used for local calls will be recycled after
51 // the transaction is executed on client in ActivityThread.
52 transaction.recycle();
53 }
54 }
其实是调用了ClientTransaction中的schedule方法
private IApplicationThread mClient;
public void schedule() throws RemoteException {
129 mClient.scheduleTransaction(this);
130 }
IApplicationThread其实是一个aidl接口在ActivityThread中定义,
继续查看IApplicationThread里面的scheduleTransaction方法,
private class ApplicationThread extends IApplicationThread.Stub {
..........................
@Override
1539 public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
1540 ActivityThread.this.scheduleTransaction(transaction);
1541 }
}
..........................
接着调用ActivityThread里面的scheduleTransaction方法,如果你在ActivityThread类里面搜的话
是找不到的这个方法的.那就去查看是ActivityThread继承了谁ClientTransactionHandler,进而查找
这个里面的方法
/** Prepare and schedule transaction for execution. */
43 void scheduleTransaction(ClientTransaction transaction) {
44 transaction.preExecute(this);
//调用ActivityThread类里面的方法sendMessage方法
45 sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
46 }
47
查看ActivityThread里面的sendMessage方法,不管怎样都会调用到mH的sendMessage方法
void sendMessage(int what, Object obj) {
2757 sendMessage(what, obj, 0, 0, false);
2758 }
2759
2760 private void sendMessage(int what, Object obj, int arg1) {
2761 sendMessage(what, obj, arg1, 0, false);
2762 }
2763
2764 private void sendMessage(int what, Object obj, int arg1, int arg2) {
2765 sendMessage(what, obj, arg1, arg2, false);
2766 }
2767
2768 private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
2769 if (DEBUG_MESSAGES) Slog.v(
2770 TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
2771 + ": " + arg1 + " / " + obj);
2772 Message msg = Message.obtain();
2773 msg.what = what;
2774 msg.obj = obj;
2775 msg.arg1 = arg1;
2776 msg.arg2 = arg2;
2777 if (async) {
2778 msg.setAsynchronous(true);
2779 }
2780 mH.sendMessage(msg);
2781 }
2782
2783 private void sendMessage(int what, Object obj, int arg1, int arg2, int seq) {
2784 if (DEBUG_MESSAGES) Slog.v(
2785 TAG, "SCHEDULE " + mH.codeToString(what) + " arg1=" + arg1 + " arg2=" + arg2 +
2786 "seq= " + seq);
2787 Message msg = Message.obtain();
2788 msg.what = what;
2789 SomeArgs args = SomeArgs.obtain();
2790 args.arg1 = obj;
2791 args.argi1 = arg1;
2792 args.argi2 = arg2;
2793 args.argi3 = seq;
2794 msg.obj = args;
2795 mH.sendMessage(msg);
2796 }
接着查看mH这个是什么,ActivityThread的成员变量
final H mH = new H();
class H extends Handler {
public void handleMessage(Message msg) {
.................
case EXECUTE_TRANSACTION:
1807 final ClientTransaction transaction = (ClientTransaction) msg.obj;
1808 mTransactionExecutor.execute(transaction);
1809 if (isSystem()) {
1810 // Client transactions inside system process are recycled on the client side
1811 // instead of ClientLifecycleManager to avoid being cleared before this
1812 // message is handled.
1813 transaction.recycle();
1814 }
1815 // TODO(lifecycler): Recycle locally scheduled transactions.
.................
}
}
接着查看mTransactionExecutor,这个成员变量是在ActivityThread里面被赋值的.TransactionExecutor.java
public void execute(ClientTransaction transaction) {
65 final IBinder token = transaction.getActivityToken();
66 log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);
67
68 executeCallbacks(transaction);
69
70 executeLifecycleState(transaction);
71 mPendingActions.clear();
72 log("End resolving transaction");
73 }
对于executeCallbacks和executeLifecycleState来说都是调用到了cycleToPath方法,查看这个方法
private void cycleToPath(ActivityClientRecord r, int finish,
161 boolean excludeLastState) {
162 final int start = r.getLifecycleState();
163 log("Cycle from: " + start + " to: " + finish + " excludeLastState:" + excludeLastState);
164 final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
165 performLifecycleSequence(r, path);
166 }
167
继续调用到ActivityThread类里面的方法, mTransactionHandler是ActivityThread的父类
/** Transition the client through previously initialized state sequence. */
169 private void performLifecycleSequence(ActivityClientRecord r, IntArray path) {
170 final int size = path.size();
171 for (int i = 0, state; i < size; i++) {
172 state = path.get(i);
173 log("Transitioning to state: " + state);
174 switch (state) {
175 case ON_CREATE:
176 mTransactionHandler.handleLaunchActivity(r, mPendingActions,
177 null /* customIntent */);
178 break;
179 case ON_START:
180 mTransactionHandler.handleStartActivity(r, mPendingActions);
181 break;
182 case ON_RESUME:
183 mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */,
184 r.isForward, "LIFECYCLER_RESUME_ACTIVITY");
185 break;
186 case ON_PAUSE:
187 mTransactionHandler.handlePauseActivity(r.token, false /* finished */,
188 false /* userLeaving */, 0 /* configChanges */, mPendingActions,
189 "LIFECYCLER_PAUSE_ACTIVITY");
190 break;
191 case ON_STOP:
192 mTransactionHandler.handleStopActivity(r.token, false /* show */,
193 0 /* configChanges */, mPendingActions, false /* finalStateRequest */,
194 "LIFECYCLER_STOP_ACTIVITY");
195 break;
196 case ON_DESTROY:
197 mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */,
198 0 /* configChanges */, false /* getNonConfigInstance */,
199 "performLifecycleSequence. cycling to:" + path.get(size - 1));
200 break;
201 case ON_RESTART:
202 mTransactionHandler.performRestartActivity(r.token, false /* start */);
203 break;
204 default:
205 throw new IllegalArgumentException("Unexpected lifecycle state: " + state);
206 }
207 }
208 }
在ActivityThread里面调用handleLaunchActivity, 接着调用performLaunchActivity这个方法
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
.......
mInstrumentation.callActivityOnCreate(activity, r.state);
.......
}
查看Instrumentation.java里面的callActivityOnCreate方法
终于调用到了performCreate的方法,调用Activity里面的oncreate方法
public void callActivityOnCreate(Activity activity, Bundle icicle) {
1270 prePerformCreate(activity);
1271 activity.performCreate(icicle);
1272 postPerformCreate(activity);
1273 }
1274
接着调用handleStartActivity方法,handleResumeActivity等方法,添加view的操作在onresume里面操作