Activity启动流程笔记

一直遇到这个问题,而且提示与生命周期不同,很是疑惑。于是网上搜罗,并翻看《Android开发艺术探索》,发现多是代码,长篇大论。好奇心所致,一路ctrl+B,看看能收获些什么。


Activity的启动流程,涉及应用进程端和系统服务端两部分,因此,为跨进程通讯。既然是跨进程,那就离不开AndroidBinder机制。

Binder机制,为C/S模式,是单向的。而应用进程端与系统服务端的通讯是双向的,互为Client/Server。所以,需要两个BinderActivityManagerNativeApplicationThreadNative就是这两个Binder。先说一下,这两Binder及其子类。

 

ActivityManagerNative

ActivityManagerNative继承自Binder,实现了IActivityManager接口(该接口定义了与Activity manager Service通讯的接口)。ActivityManagerNative还包含一个内部类ActivityManagerProxy。但ActivityManagerNative仍是一个抽象类。

 

ActivityManagerService

ActivityManagerService继承于ActivityManagerNative,并实现了内部的抽象方法。该类对象位于系统进程中。

因此,ActivityManagerProxy对象可以看做是ActivityManagerService在应用进程端的代理。可以通过ActivityManagerNativegetDefault静态方法来获取到该代理。

通过调用ActivityManagerProxy对象所提供的方法,完成应用进程端至系统服务端的通讯。

 

ApplicationThreadNative

ApplicationThreadNative继承自Binder,实现了IApplicationThread接口(该接口定义了与Application通讯的接口)。ApplicationThreadNative也包含一个内部类ApplicationThreadProxyApplicationThreadNative也是一个抽象类。

 

ApplicationThread

ApplicationThread继承自ApplicationThreadNative,并实现了内部抽象方法。

ApplicationThreadActivityThread的一个内部私有类。

ActivityThread是应用的主线程。

ActivityThread还存在一个内部私有类H,实为Handler,用于处理内部消息。

通过调用ApplicationThreadProxy对象所提供的方法,完成系统服务端至应用进程端的通讯。

 

由于ApplicationThreadActivityManagerService的存在,使得双向通讯得以完成。

 

与生命周期的关系

Activity的启动,涉及android framework,需要阅读核心代码,且代码十分繁琐。因此,对于其流程,也只能看一下顺序,了解个大概的机制。

结合Activity的生命周期,整个流程大致分以下几步:

(1)    执行栈顶activityonPause

(2)    查看当前要启动的目标activity所在进程是否被创建。若未创建则,则执行步骤(3);否则,跳至步骤(4);

(3)    启动activity所在进程;

(4)    依次触发activity的生命周期方法,onCreateonStartonResume

(5)    触发原栈顶activityonStop方法。

 

但,毕竟启动过程,不仅仅是生命周期方法的调用。硬着头皮,捋着代码走了一遍。才有了以下笔记。希望有助于记忆。

 

参考

整理过程中,参考了部分文章,也列在下面。

http://blog.csdn.net/qq_23547831/article/details/51224992

http://blog.csdn.net/tellh/article/details/57418651

http://blog.csdn.net/ccjhdopc/article/details/72551767

http://blog.csdn.net/zhaokaiqiang1992/article/details/49428287

http://blog.csdn.net/tfygg/article/details/52086621

文中有部分描述还是模糊,仍需要查看代码,才得以确认。

此外,对于android framework代码,若不想下载,可访问网址

http://grepcode.com/search?query=&start=0&entity=type&n=

在线查看。只需要输入要查找的类即可,很方便。

小结

先把小结写在前面,时因为整个Go To Definition过程多少有些乏味和漫长。

这个过程中,会在ActivityThread(将要启动的Activity),ActivityThread(当前处于栈顶的Activity)和ActivityManagerService间不断的跳转。因为前两者是不同的进程,不能直接通讯,所以需要系统服务进程ActivityManagerService这个管理者出现,为两者传递信息。


系统核心进程zygote,也会参与到启动过程中。当将要启动的Activity所在的进程未被启动时,zygote将创建该进程。


1)调用startActivity时,当前进程会通过ActivityManagerProxyAMS(ActivityManagerService)发送信息。通知其执行当前栈顶的ActivityonPause

2AMS收到请求后,通过ApplicationThreadProxy向当前栈顶ActivityActivityThread发送信息。

3)当前栈顶ActivityActivityThread接收到请求后,发送messageHH触发该ActivityonPause。执行完毕后,当前栈顶ActivityActivityThread,通过ActivityManagerProxy通知AMS(ActivityManagerService),操作完成。

4AMS收到请求后,查看将要启动的目标Activity所在进程是否已被启动。若未启动,则通知系统核心zygote创建进程,并将进程启动类ActivityThread名称作为参数,提供给zygote.

5zygote创建完进程后,触发ActivityThreadMain方法,初始化进程。初始化结束后,ActivityThread通过ActivityManagerProxy通知AMS(ActivityManagerService)操作完毕。

6AMS收到请求后,通过ApplicationThreadProxy向目标ActivityThread(新建成的)发送请求,要求其启动目标Activity

7)目标ActivityThread收到请求后,发送messageHH依次触发handleLaunchActivity操作,和handleResumeActivity操作。前者执行目标ActivityonCreateonStart,后者执行onResumehandleResumeActivity最后会再次通过ActivityManagerProxy通知AMS(ActivityManagerService),进行Idle操作。

8AMS接收请求后,会在空闲时通过ApplicationThreadProxyt通知原栈顶ActivityActivityThread,对原栈顶Activity执行onPause操作。或在内存不足时,执行onSaveInstanceState操作。


整个流程小结完毕。

Go to Definition

下面是走流程时做的笔记。

1)栈顶activityonPause

启动一个Activity,是从startActivity()法开始的逐级调用。


startActivity
        ->startActivityForResult
                ->Instrumentation.execStartActivity
                        ->ActivityManagerNative.getDefault().startActivity

InstrumentationActivity的一个应用进程端的实际操作类。

当调用ActivityManagerNative.getDefault().startActivity时,根据Binder机制,实际是调用了ActivityManagerService对象的startActivity方法。操作从应用进程端,跳转至系统服务端。


ActivityManagerService.startActivity 
        ->startActivityAsUser
                ->StackSupervisor.startActivityMayWait
                        -> StackSupervisor.startActivityLocked
                                -> StackSupervisor.startActivityUncheckedLocked
                                        -> ActivityStack.startActivityLocked
                                                -> ActivityStackSupervisor.resumeTopActivitiesLocked
                                                        ->ActivityStack.resumeTopActivityLocked 
                                                                ->ActivityStack.startPausingLocked
                                                                        -> prev.app.thread.schedulePauseActivity

prev.app.thread为一个IApplicationThread对象,即ApplicationThreadProxy对象。

因此,此时操作又从系统服务端,跳转至应用进程端。该进程为栈顶Activity所在的进程。继续,


ApplicationThread.schedulePauseActivity
        ->ActivityThread.sendMessage (PAUSE_ACTIVITY_FINISHING)
                ->H.sendMessage
                        ->H.handleMessage
                                ->ActivityThread.handlePauseActivity
                                        ->ActivityThread.performPauseActivity
                                                ->mInstrumentation.callActivityOnPause
                                                        ->activity.performPause
                                        ->ActivityManagerNative.getDefault().activityPaused

在应用进程中ApplicationThread发送PAUSE_ACTIVITY_FINISHING消息至HH处理后触发mInstrumentation最终调用了activity.performPause方法。

至此栈顶activity 应用进程端的Pause处理结束。

2启动目标Activity所在进程。

在上一阶段的ActivityThread.handlePauseActivity方法中处理完应用进程端的Pause处理后还调用了ActivityManagerNative.getDefault().activityPaused使得处理流程再次从应用进程跳转至系统服务端。


ActivityManagerService.activityPaused
        ->ActivityStack.activityPausedLocked
                ->ActivityStack.completePauseLocked
                        ->ActivityStackSupervisor.resumeTopActivitiesLocked
                                ->ActivityStack.resumeTopActivityLocked
                                        ->ActivityStack.resumeTopActivityInnerLocked
                                                ->ActivityStackSupervisor.startSpecificActivityLocked
                                                        ->ActivityStackSupervisor.realStartActivityLocked
                                                        Or
                                                        ->mService.startProcessLocked

其中,ActivityStackSupervisor.startSpecificActivityLocked方法会判断一下需要启动的目标Activity所在应用进程是否已经启动若启动的话则直接调用ActivityStackSupervisor.realStartActivityLocked方法触发目标Activity的生命周期否则调用mServicestartProcessLocked方法用于启动应用进程。

mService是什么一个ActivityManagerService对象。

因此,在目标Activity所在应用进程未被启动的情况下调用StartProcessLocked方法时操作又从应用进程转至系统服务端。


ActivityManagerService. startProcessLocked
        ->Process.start
                -> Process.startViaZygote
                        ->Process.zygoteSendArgsAndGetResult

Zygoteandroid系统中用于创建新进程的核心进程。每个进程都有一个启动类。

进程的启动类名“android.app.ActivityThread”被当做参数,在Process.start方法中设置,并传入Process.startViaZygote中。

当新进程创建完毕后,会依照启动类名反射至启动类,并自动执行进程启动类的main方法。即ActivityThreadmain方法。


ActivityThread.main
        ->new ActivityThread
                -> ActivityThread.attach
                        -> ActivityManagerNative.getDefault.attachApplication

再次跳转至ActivityManagerService中。


ActivityManagerService.attachApplicationLocked
              ->ActivityStackSupervisor.attachApplicationLocked
                      ->ActivityStackSupervisor.realStartActivityLocked

又见到realStartActivityLocked方法了。之前提过,该方法是用于启动Activity的。因此,说明从当前位置开始,将进行目标activity的生命周期操作。进程启动操作完毕。

3)启动Activity

ActivityStackSupervisor.realStartActivityLocked
        ->app.thread.scheduleLaunchActivity

操作从系统服务端跳转至应用进程端。


ActivityThread.scheduleLaunchActivity
        ->sendMessage(H.LAUNCH_ACTIVITY)
                ->H.handleMessage
                        ->ActivityThread.handleLaunchActivity
                                ->ActivityThread.performLaunchActivity
                                        ->mInstrumentation.callActivityOnCreate
                                                ->activity.performCreate
                                                        ->activity.onCreate
                                        ->activity.performStart
                                                ->mInstrumentation.callActivityOnStart
                                                        -> activity.onStart
                                ->ActivityThread.handleResumeActivity
                                        ->ActivityThread.performResumeActivity
                                                ->r.activity.performResume
                                                        ->mInstrumentation.callActivityOnResume
                                                                ->activity.onResume
                                        ->Looper.myQueue().addIdleHandler(new Idle)

从过程中可以看到,在处理LAUNCH_ACTIVITY消息时,handler执行了ActivityThread.handleLaunchActivity方法。该方法依次执行了两个方法,ActivityThread.performLaunchActivity和ActivityThread.handleResumeActivity。前者触发了目标activityonCreate方法,和onStart方法。而后者,则触发了activityonResume方法。

至此Activity完成显示。但这并未结束。此前栈顶的activity还有操作未完成。

4)执行栈顶ActivityonStop

在处理目标activity onResume生命周期的handleResumeActivity方法中,结尾处,调用了Looper.myQueue().addIdleHandler(new Idler())。这个方法很不起眼,但却触发了空闲情况下的处理机制。

Idler继承于MessageQueue.IdleHandler。用于在线程空闲时,执行某种操作。空闲时,其queueIdle方法将被触发。


Idler.queueIdle
        ->ActivityManagerNative.getDefault().activityIdle

又是一个熟悉的身影~再次跳转至系统服务端。


ActivityManagerService.activityIdle
                ->ActivityStack.stopActivityLocked() 
                        ->r.app.thread.scheduleStopActivity

再次跳转至应用进程端,原置顶activity所在的进程。


ActivityThread.scheduleStopActivity
       -> ActivityThread.sendMessage
              ->H.handleMessage
                     ->ActivityThread.handleStopActivity
                            -> ActivityThread.performStopActivityInner
                                   ->ActivityThread.callCallActivityOnSaveInstanceState
                                   or
                                   ->Activity.performStop

ActivityThread.performStopActivityInner方法中,根据情况,会触发两个不同的操作。若内存不足,需要回收,则触发ActivityThread.callCallActivityOnSaveInstanceState;而正常情况下,则会触发Activity.performStop。

我们先来看一下正常情况。

Activity.performStop
       ->mInstrumentation.callActivityOnStop
              ->Activity.onStop

终于,onStop出现。 原栈顶activity的onStop完成。

再来看,内存不足的情况。

ActivityThread.callCallActivityOnSaveInstanceState
       ->mInstrumentation.callActivityOnSaveInstanceState
              ->Activity.performSaveInstanceState
                     ->Activity.onSaveInstanceState

原栈顶activity的onSaveInstanceState方法完成。

至此,整个Activity的启动完毕。


猜你喜欢

转载自blog.csdn.net/daihuimaozideren/article/details/79662874