Android AMS分析之Activity启动过程

  在Android framework的systemService中有多个以线程形式存在的Service, 如ActivityManagerService、WindowMangerService等等, 其中ActivityManagerService(AMS)是个很重要的Service, 管理着四大组件的生命周期,本文先从Activity的启动过程入手, 了解从App端请求一个Activity, 到AMS进行一系列处理并与之交互的大概流程, 从而对Acitivity的启动过程有一个感性的认识。

首先,应用端通过Activity.startActivity()的方式启动一个Activity, 通过binder方式调用AMS所在进程方法。AMS收到请求后, 构建一个此Activity对应的ActivityRecord对象,并加入到内部缓存队列mHistory中。随后调用resumeTopActivityLocked()方法,开始启动Activty。

过程如下图所示:

Android AMS分析之Activity启动过程_第1张图片

 

开始启动新Activity时,resumeTopActivityLocked()方法从刚刚的那个mHistory里取存在栈顶的Activity,就是刚刚put进的那个新Activity,但这是AMS会先判断mResumedActivity是否为空,即当前是否有一个正在显示的Activity,如果有,则先去暂停这个旧的Activity。这个过程中会回调App进程的相应方法,我们常见的onPause()就是在这个过程里调用的。暂停后,这个Activity对应的ActivityRecord对象会被放到mStoppingActivities缓存里去,此时旧Activity还没有完全停掉。

如下图

Android AMS分析之Activity启动过程_第2张图片

 

在暂停之后,AMS会再次调研resumedTopActivityLocked()方法

Android AMS分析之Activity启动过程_第3张图片

 

resumedTopActivityLocked()还是先取mHistory栈顶的Activity(ActivityRecord对象),此时已没有正在显示的Acitvity,所以往下走去启动新的Activity。

在启动这个Activity之前,会判断Activity所在的进程是否启动,如果没启动,则先启动进程,进程启动后,会回调AMS的attachApplicationLocked()方法。在一系列处理之后,调用realStartActivityLocked()方法,这个时候,就要真正开始启动这个Activity了

Android AMS分析之Activity启动过程_第4张图片

 

在realStartActivityLocked()方法中,通过调用scheduleLaunchActivity()方法回调到App进程,App进程随后会调用到performLaunchActivity()方法,在这个方法里完成我们熟悉一些Activity生命周期相关方法的调用。比如,如果发现application对象不存在,会先生成application对象,随后调用其onCreate方法,这就是我们熟悉的Application.onCreate()方法。随后会继续调用Activity的onCreate、onStart、onResume等方法,随后调用activityIdleInternal()通知AMS。这个时候新Activity已经显示在页面上了。此时AMS才会回过头停止掉旧的Activity(就是从之前的那个mStoppingActivities缓存里获取)。随后调用trimApplications();进行一次内存清理操作。

此时一个Activity的启动过程基本完成。AMS只是管理Activity的生命周期,具体的绘制相关工作由WMS来管理完成。

你可能感兴趣的:(android)