启动Activity有情况,从系统应用界面点击进入和在应用内部启动新Actvity
前者调用Launcher类的startActivitySafely方法,Launcher类继承Activity类,startActivitySafely方法中调用Activity类实现的startActivity方法。
后者就直接调用Activity类实现的startActivity方法。
startActivity实现很简单,它调用startActivityForResult来进一步处理。
在startActivityForResult中调用Intrumentation的execStartActivity方法,其中mInstrumentation对象为Activity的成员变量,Instrumentation(直译过来意思是仪器仪表),主要作用是用来监控应用程序和系统的交互。
在execStartActivity中通过ActivityManagerNative.getDefault()获取ActivityManagerService的远程接口ActivityManagerProxy(注意:API 26之后更新了),调用ActivityManagerProxy接口的startActivity方法。
ActivityManagerProxy的startActivity通过Binder驱动程序就进入到ActivityManagerService的startActivity函数
ActivityManagerService的startActivity中简单地将操作转发给成员变量mMainStack的startActivityMayWait函数,这里的mMainStack的类型为ActivityStack。
在startActivityMayWait中调用ActivityStack的startActivityLocked方法进一步处理。
在startActivityLocked中,通过参数caller获取调用者的进程信息,并保存在ProcessRecord类型的callerApp变量中。并通过参数resultTo获得这个Activity的相关信息保存在ActivityRecord类型的sourceRecord变量中,resultTo参数一开始是Activity类的成员变量mToken传入的,它是一个Binder对象的远程接口。然后将即将要启动的Activity的相关信息,并保存在ActivityRecord类型的r变量中。最后调用ActivityStack的startActivityUncheckedLocked函数进行下一步操作。
startActivityUncheckedLocked方法做了很多我们熟悉的工作。其中有判断Activity的启动模式,判断Activity是否在栈顶,判断是否要新创建一个Task等等工作,如果新增了Task就调用mService.addRecentTaskLocked(r.task),即在ActivityManagerService中新增Task,最后调用ActivityStack的startActivityLocked(r, newTask, doResume)进一步处理。
startActivityLocked(r, newTask, doResume)中将即将启动的Activity信息ActivityRecord r添加到ActivityStack的成员变量mHistory制定位置addPos,doResume参数为true,进而调用ActivityStack的resumeTopActivityLocked进一步操作。
resumeTopActivityLocked中如果mResumedActivity(当前正被执行的Activity)不为空,调用 ActivityStack的startPausingLocked把当前执行的Activity推入Paused状态去。
startPausingLocked方法对ActivityStack的几个成员变量进行重新赋值,将mResumedActivity当前Activity赋值给mPausingActivity和mLastPausedActivity,再将其置空,将当前Activity的状态设为ActivityState.PAUSING,最后调用
prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving, prev.configChangeFlags)
把当前Activity进程中的ApplicationThread对象取出来,通过它来通知这个Activity它要进入Paused状态了。这里的prev.app.thread是一个ApplicationThread对象的远程接口ApplicationThreadProxy,通过调用这个远程接口的schedulePauseActivity来通知当前Activity进入Paused状态。
ApplicationThreadProxy的schedulePauseActivity通过Binder进程间通信机制进入到ApplicationThread.schedulePauseActivity函数中。
ApplicationThread是ActivityThread的内部类,schedulePauseActivity方法中调用ActivityThread的成员函数queueOrSendMessage。
queueOrSendMessage将执行任务标记(H.PAUSE_ACTIVITY_FINISHING或H.PAUSE_ACTIVITY)以及被执行的Activity的IBinder对象等信息封装到Message对象,通过ActivityThread的成员变量mH(类型是H,继承于Handler类,是ActivityThread的内部类)发送此消息。
发送完消息在H的handleMessage接收,如果是PAUSE_ACTIVITY,则调用ActivityThread的handlePauseActivity方法处理。
handlePauseActivity方法先判断userLeaving是否为true,如果为true,调用performUserLeavingActivity方法,在Activity中的onUserLeaveHint中回调,通知是用户要离开当前Activity。然后调用performPauseActivity,在Activity的onPause中回调,performPauseActivity方法返回Bundle类型的state对象。最后调用ActivityManagerNative.getDefault().activityPaused(token, state)来告诉ActivityManagerService当前Activity已经进入Paused状态,可以启动新Activity了。
ActivityManagerProxy的activityPaused通过Binder进程间通信机制就进入到ActivityManagerService.activityPaused方法。
ActivityManagerService的activityPaused中用mMainStack调用activityPaused再次进入到ActivityStack类中,执行activityPaused方法。
ActivityStack的activityPaused中先通过参数token找到在mHistory列表中对应的ActivityRecord类型的r,如果r与ActivityStack的成员变量mPausingActivity指向用一个Activity执行completePauseLocked方法。
ActivityStack的completePauseLocked将mPausingActivity置为空,然后调用resumeTopActivityLokced进一步操作,resumeTopActivityLokced传入的参数即为当前Pause的Activity的ActivityRecord对象。
ActivityStack的resumeTopActivityLokced先通过topRunningActivityLocked获取即将启动的Activity的ActivityRecord保存在next,满足一定条件后调用startSpecificActivityLocked(next, true, true)。
ActivityStack的startSpecificActivityLocked使用mService的getProcessRecordLocked获取ProcessRecord保存于app,判断app是否为空,不为空则调用ActivityStack的realStartActivityLocked。如果app为空,需要启动新的进程,则用mService(ActivityManagerService)调用startProcessLocked。
ActivityManagerService的startProcessLocked再次判断是否已经有以process + uid命名的进程存在,如何为空,则创建并保存到ActivityManagerService中ProcessRecord类型的成员变量mProcessNames中,最后,调用另一个startProcessLocked函数进一步操作。
ActivityManagerService的startProcessLocked主要调用了Process.start方法来创建一个新的进程,新的进程会导入android.app.ActivityThread类,并且执行它的main函数。每一个应用程序都有一个ActivityThread实例来对应。
在ActivityThread的main函数中创建ActivityThread对象,调用它的attach方法,接着就进入消息循环了,直到最后进程退出。attach方法通过ActivityManagerNative.getDefault()调用了ActivityManagerService的远程接口ActivityManagerProxy的attachApplication函数,传入的参数是mAppThread,这是一个ApplicationThread类型的Binder对象,它的作用是用来进行进程间通信的。
ActivityManagerProxy的attachApplication中通过Binder驱动程序,最后进入ActivityManagerService的attachApplication函数中。
ActivityManagerService的attachApplication将操作转发给attachApplicationLocked方法。
ActivityManagerService的attachApplicationLocked取回已经创建的ProcessRecord存入app变量并初始化其他app的成员变量,然后调用mMainStack.topRunningActivityLocked(null)从栈顶取回即将启动的Activity存入hr,最后调用mMainStack.realStartActivityLocked执行真正的Activity启动操作,hr和app作为参数传入realStartActivityLocked方法。
ActivityStack的realStartActivityLocked最终通过app.thread调用ApplicationThreadProxy的scheduleLaunchActivity方法。
ApplicationThreadProxy的scheduleLaunchActivity最终通过Binder驱动程序进入到ApplicationThread的scheduleLaunchActivity函数中。
ApplicationThread的scheduleLaunchActivity中先创建一个ActivityClientRecord对象r,初始化r的成员变量,调用queueOrSendMessage(H.LAUNCH_ACTIVITY, r)。
ApplicationThread的queueOrSendMessage将执行任务标记(H.LAUNCH_ACTIVITY)以及被执行的Activity的ActivityClientRecord对象等信息封装到Message对象,通过ActivityThread的成员变量mH发送此消息。
在H类handleMessage中接收消息,在case LAUNCH_ACTIVITY下调用handleLaunchActivity处理即将启动的Activity。
ActivityThread的handleLaunchActivity首先调用performLaunchActivity来加载即将启动的Activity类,然后调用它的onCreate方法,完成后回到handleLaunchActivity再调用handleResumeActivity进入Activity的onResume方法,遵循Activity的生命周期的。
ActivityThread的performLaunchActivity首先收集要启动的Activity的主要package和component信息,调用mInstrumentation.newActivity通过ClassLoader加载Activity类,然后调用makeApplication创建Application对象,通过activity.attach方法将这些上下文信息设置到启动Activity中去,调用mInstrumentation.callActivityOnCreate间接调用启动Activity的onCreate方法,mInstrumentation在这里的作用是监控Activity与系统的交互操作,相当于是系统运行日志。
到此为止Activity已经完成启动!