Android四大组件之Activity(一)—— 启动过程综述
作者:互联网
1、使用的是Android 7.1.2的源代码:
https://pan.baidu.com/s/1XcVD68cC_2wKtm8jJkdNQA
przv
2、感谢IT先森的系列博客:
Android应用进程创建流程大揭秘
Android四大组件之bindService源码实现详解
Android四大组件之Activity启动流程源码实现详解概要
Activity启动流程(一)发起端进程请求启动目标Activity
Activity启动流程(二)system_server进程处理启动Activity请求
Activity启动流程(三)-Activity Task调度算法复盘分析
Activity启动流程(四)-Pause前台显示Activity,Resume目标Activity
Activity启动流程(五)请求并创建目标Activity进程
Activity启动流程(六)注册目标Activity进程到system_server进程以及创建目标Activity进程Application
Activity启动流程(七)初始化目标Activity并执行相关生命周期流程
伪代码:
发起端进程发起启动Activity请求
Activity.startActivity(...)
Activity.startActivityForResult(...) //mTocken是Activity中的
mInstrumentation.execStartActivity(...)
AMP.startActivity(...)//通过AMS代理端向AMS发起启动Activity的Binder IPC请求
mInstrumentation.checkStartActivityResult(...)//检测启动是否成功
mMainThread.sendActivityResult(...)
system_server进程端
AMS解析Intent
AMS.startActivity(...)
ActivityStarter.startActivityMayWait(...)
ResolveInfo rInfo = ASS.resolveIntent(...)//收集Intent所指向的Activity信息, 当存在多个可供选择的Activity,则直接向用户弹出resolveActivity
IPackageManager.Stub.resolveIntent(...)//通过PKMS实体查询
PKMS.resolveIntent(...)
PKMS.queryIntentActivitiesInternal(...)
PKMS.chooseBestActivity(...)
ActivityInfo aInfo = ASS.resolveActivity(...) //根据获取的rInfo信息重新组装intent和设置启动的参数信息
//创建目的端Activity的ActivityRecord
ActivityStarter.startActivityLocked(...)
ActivityRecord r = new ActivityRecord(callerApp,intent,aInfo,mSupervisor,...)
appToken = new Token(this, _intent);
设置state为INITIALIZING
ActivityStarter.startActivityUnchecked(...)
//包括两方面内容:
//1、AMS对于Activity比较复杂的部分即Task任务栈和Stack的处理,其中会把目标Activity放置到栈顶端
//2、resumed相关操作
// 目标Activity所属Stack栈存在Resume状态的Activity时会执行其onPause方法,否则执行的就是其它Stack栈中的了
// 错误说法:启动一个Activity的时候最先被执行的是栈顶的Activity的onPause方法
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked
ActivityStack.resumeTopActivityUncheckedLocked
ActivityStack.resumeTopActivityInnerLocked
ActivityStack.startPausingLocked
ApplicationThreadProxy.schedulePauseActivity
发起端进程处理schedulePauseActivity
ActivityThread.ApplicationThread.schedulePauseActivity
ActivityThread.H.handleMessage(case PAUSE_ACTIVITY)
ActivityThread.handlePauseActivity //1.指定前台Activity的onPause();2.通过AMP回调activityPaused()通知AMS
ActivityThread.performPauseActivity
ActivityThread.performPauseActivityIfNeeded
Instrumentation.callActivityOnPause
Activity.performPause
Activity.onPause()
ActivityManagerNative.getDefault().activityPaused(token);
system_server进程端
AMS.activityPaused
ActivityStack.activityPausedLocked
ActivityStack.completePauseLocked
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked //又调用了resumeFocusedStackTopActivityLocked
ActivityStack.resumeTopActivityUncheckedLocked
ActivityStack.resumeTopActivityInnerLocked
ActivityStackSupervisor.startSpecificActivityLocked
AMS.startProcessLocked
AMS.startProcessLocked
AMS.newProcessRecordLocked
addProcessNameLocked(r);//将ProcessRecord信息在AMS中存储起来
AMS.startProcessLocked
//final String entryPoint = "android.app.ActivityThread";
Process.start(entryPoint, ··· ···)
Process.startViaZygote()
Process.zygot
eSendArgsAndGetResult(openZygoteSocketIfNeeded(
abi), argsForZygote);
//======Zygote进程======
ZygoteInit.main
//1
ZygoteInit.registerZygoteSocket //创建zygote通信服务端,LocalServerSocket实例对象sServerSocket
//2
ZygoteInit.runSelectLoop //进入无限死循环,等待客户端的请求;会抛出MethodAndArgsCaller异常
Os.poll
ZygoteInit.acceptCommandPeer //创建ZygoteConnection对象,即创建Socket通道ZygoteConnection
ZygoteConnection.ZygoteConnection
ZygoteConnection.runOnce
Zygote.forkAndSpecialize
ZygoteHooks.preFork
Daemons.stop
ZygoteHooks.nativePreFork
dalvik_system_ZygoteHooks.ZygoteHooks_nativePreFork
Runtime::PreZygoteFork
heap_->PreZygoteFork()
Zygote.nativeForkAndSpecialize
com_android_internal_os_Zygote.ForkAndSpecializeCommon
fork()
Zygote.callPostForkChildHooks
ZygoteHooks.postForkChild
dalvik_system_ZygoteHooks.nativePostForkChild
Runtime::DidForkFromZygote
ZygoteHooks.postForkCommon
Daemons.start
//======子进程======
ZygoteConnection.handleChildProc
RuntimeInit.zygoteInit
RuntimeInit.commonInit
RuntimeInit.nativeZygoteInit
RuntimeInit.applicationInit
RuntimeInit.invokeStaticMain //抛出异常:MethodAndArgsCaller
MethodAndArgsCaller.run() //runSelectLoop中抛出异常
ActivityThread.main
//3
ZygoteInit.closeServerSocket //关闭通信socket通信通道
//新建的子进程
ZygoteConnection.handleChildProc
Activity.main() //反射调用
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
final ApplicationThread mAppThread = new ApplicationThread();
final H mH = new H();
thread.attach(false);
RuntimeInit.setApplicationObject(mAppThread.asBinder())
AMN.getDefault().attachApplication(mAppThread) //mAppThread为匿名Binder
Looper.loop();
//system_server进程
AMS.attachApplication(ApplicationThread thread)
thread.bindApplication //向目标Activity进程发起跨进程Binder调用,将进程名、ApplicationInfo等相关信息传递给应用进程
ActivityStackSupervisor.attachApplicationLocked(ProcessRecord app) //检查有没有待启动的Activity
app.thread.scheduleLaunchActivity
··· ···
//新建的子进程
ActivityThread.ApplicationThread.scheduleLaunchActivity
sendMessage(H.LAUNCH_ACTIVITY, r)
ActivityThread.H.handleMessage
ActivityThread.handleLaunchActivity
Activity a = performLaunchActivity
mInstrumentation.callActivityOnCreate
Activity.performCreate
Activity.onCreate()
Activity.performStart
mInstrumentation.callActivityOnStart
Activity.onStart
ActivityThread.handleResumeActivity
performResumeActivity
Activity.performResume
mInstrumentation.callActivityOnResume
Activity.onResume
标签:...,综述,启动,ActivityThread,Activity,进程,Android,AMS 来源: https://blog.csdn.net/aaqian1/article/details/113054067