Activity启动流程
2018-09-29 10:44:49 8 举报
Activity启动流程,但是Process的那部分还没有加入,后期会加入
作者其他创作
大纲/内容
ActivityThread.queueOrSendMessage
1.判断要启动的Activity是不是用户手动启动的,如果是用户手动启动的,那么mUserLeaving = true,要想Launcher发送一个用户离开事件通知2.判断这个要启动的Activity是否和源Activity在同一个Task,如果false,那么查看要启动的Activity的专属task是否已经存在,如果相关task不存在,那么会创建一个TaskRecord并交给AMS管理。相关属性是android:taskAffinity.
Activity.startActivity
AMS.startProcessLocked
1.启动MainActivity2.将MainActivity状态设置为resume
ActivityThread.H.handleMessage
找出这个要启动的Acitivity的ProcessRecord,之后通过这个判断,如果ProcessRecord不为空且ProcessRecord的thread变量不为空就直接Activity,否则要根据用户ID和进程名称来创建一个应用程序进程。因为是在启动之后的进程中启动SubActivity,所以直接走启动Activity流程
MainActivity.onCreate
ActivityThread.performLaunchActivity
通过传来的信息创建ActivityClientRecord,然后通过ActivityClientRecord作为参数调用下面方法
ActivityStack.startActivityUncheckedLocked
Binder
在mHistory中自顶而下查找和SubActivity相同的task的ActivityRecord的位置,并把SubActivity的ActivityRecord放入找到的位置之后
ActivityStack.startActivityLocked
先把成员变量mPausingAcitivity设置为null,再判断不是处于休眠并且不是关机,则调用下一个方法
1.将Launcher的ActivityRecord从resume转为pause,将mResumedActivity = null,mPausedActivity = Launcher的ActivityRecord,mLastPausedActivity = Launcher的ActivityRecord2.通过ActivityRecord中的ProcessRecord的ApplicationThread来通知Launcher进入中止状态
AMS.activityPause
AMS.attachApplicationLocked
ApplicationThread.scheduleLaunchActivity
1.通过AMS来获得描述该应用程序进程的ProcessRecord,并将该应用程序进程的PID和UID保存到成员变量中2.mHistory用来描述系统的Activity组件堆栈,每个Activity都用ActivityRecord来描述,该方法中拿到了mHistory中对应Launcher的ActivityRecord中并保存到sourceRecord中3.创建描述要启动的Activity的ActivityRecord
BInder
在点击app图标的时候会去PMS中查找该app的manifest文件中查找mainActivity
AMS
1.得到要创建应用程序的用户ID和用户组ID,再通过Process类的静态函数start来启动新的应用程序进程,返回一个进程ID。然后将进程ID放入ProcessRecord中。接着以pid为key将ProcessRecord存入mPidsSelfLocked中。2.像AMS所在的线程发送一个消息,并在delay后处理,在这期间线程必须要启动,不然就不会执行,Activity也就不会启动
1.获得Activity堆栈顶部的ActivityRecord,也就是MainActivity2.接下来判断mResumedActivity是否不为空,在AMS发送中止消息给Launcher之前已经将设置为空,所以跳过3.判断要启动的Activity是否之前尚未被启动起来,根据判断调用下面方法
1.通过pid拿到对应的ProcessRecord,并保存在成员函数app中,因为应用程序进程已经启动,所以需要初始化ProcessRecord,最重要的是将thread指向ApplicationThread2.删除AMS中所运行线程的delay消息3.拿出AMS的Activity堆栈中的顶部Activity的ActivityRecord,即为要启动的Activity的ActivityRecord,并判断用户ID和进程ID是否一致,一致则调用下面的方法
重载函数
AMS.startActvity
ActivityStack.resumeTopActivityLocked
Launcher的ActivityThread进程
去PMS中解析要启动的Activity的Intent以便获取更多信息,然后放到ActivityInfo的aInfo对象中
结束
因为是要新开的task,所以就要把新开的对应的ActivityRecord放入mHistory顶部
AMS.attachApplication
ApplicationThread.schedulePauseActivity
ActivityThread.main
1.获得MainActivity的类名和包名,并创建一个Activity的实例2.创建ContextImpl,并使用ContextImpl和ActivityClientRecord来对Activity进行初始化3.之后通过mInstrumentation来真正启动Activity,这个过程会调用onCreate生命周期函数4.等到第三步完成,会用token为key保存ActivityClientRecord在ActivityThread中
保证在主线程执行
将ActivityRecord的app变量指向对应的ProcessRecord,并把ActivityRecord放入ProcessRecord的Activity列表中,之后跨进程调用下面的函数
将MainActivity的task放入SubActivity的ActivityRecord中
发送消息在主线程中启动Activity
ActivityStack .realStartActivityLocked
ActivityStack.activityPaused
1.得到堆栈顶部的ActivityRecord进行多个判断:当要启动的页面就是当前页面,直接返回;要启动的Activity是否等于上一次被中止了的Activity组件并且是否正在休眠或关机状态,直接返回;上一个Activity还没中止完,则要等到他中止完再启动,直接返回。2.如果mResumedActivity != null 则通知mResumedActivity进入paused状态
发送Message到Launcher的主线程,在主线程来执行pause操作
ActivityStack.startSpecificActivityLocked
Activity.startActivityForResult
首先判断请求创建的应用程序进程是否创建,如果不存在则根据指定名称android:process以及用户ID来创建一个ProcessRecordLocked,并将它保存在AMS的mProcessNames的Hashmap中
MainActivity的ActivityThread线程
找出这个要启动的Acitivity的ProcessRecord,之后通过这个判断,如果ProcessRecord不为空且ProcessRecord的thread变量不为空就直接Activity,否则要根据用户ID和进程名称来创建一个应用程序进程。第一次进入app是不会有进程的,所以会先启动进程
根据Launcher的Binder值在mHistory中获取ActivityRecord,并删除AMS所运行的消息队列的PAUSE_TIMEOUT_MSG消息,因为Launcher组件已经在规定时间内处理完成AMS给它发送的中止通知了并修改Launcher的ActivityRecord的STATE设置为PAUSE
ActivityThread.handleLaunchActivity
ActivityThread.handlePauseActivity
ActivityStack.startPausingLocked
1.创建一个ActivityThread,并调用ActivityThread的attach方法给AMS发一个启动完成的通知2.调用Looper的静态函数prepareMainLooper,在通知AMS之后进入消息循环中
Instrumentation.execStartActivity
MainActivity的ActivityThread进程
ActivityStack.completePauseLocked
ApplicationThread是ActivityThread的一个内部类
ActivityStack.startActivityMayWait
在相同进程中创建新的Activity,前面步骤与上面相同
1.应用程序进程中每个activity都有一个ActivityClientRecord用来描述Activity。通过Launcher的AMS中的ActivityRecord来从一个Hash表中获得ActivityClientRecord.2.获取到Launcher的ActivityClientRecord,第一件事情是调用performUserLeavingActivity发送一个用户离开事件通知;第二件事是调用performPauseActivity来发送一个终止事件通知,即调用它的onPause;第三件事是调用QueuedWork类的静态成员函数waitToFinish等待完成前面的一些数据写入操作
在这里通过ActivityClientRecord调用getPackageInfoNoCheck来获得一个LoadedApk对象,保存在ActivityClientRecord中。
AMS进程
0 条评论
下一页