其他分享
首页 > 其他分享> > Android的Activity启动流程分析

Android的Activity启动流程分析

作者:互联网

 

 

 

 

 

 

 

 


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

Activity启动之前的一些事情

Activity启动阶段

涉及到的概念

涉及到的类



 

ActivityThread.java    路径位于:\frameworks\base\core\java\android\app\ActivityThread.java

         说明: 该类为应用程序(即APK包)所对应进程(一个进程里可能有多个应用程序)的主线程类,即我们通常所说的UI线程。

           一个ActivityThread类对应于一个进程。最重要的是,每个应用程序的入口是该类中的static main()函数 。

 Instrumentation.java  路径位于 :\frameworks\base\core\java\android\app\ActivityThread.java

         说明: 该类用于具体操作某个Activity的功能----单向(oneway)调用AMS以及统计、测量该应用程序的所有开销。

            一个Instrumentation类对应于一个进程。每个Activity内部都有一个该Instrumentation对象的引用。

 

      举个例子吧。

           我们将我们应用程序比作一个四合院,那么Activity对应于四合院的人,ActivithThread对应于院子的主人----管理所有人,

    Instrumentation对应于管家------受气的命,接受来自人(Activity/ActivithThread)的命令 ,去单向(oneway)调用AMS 。
 

ApplicationThread类是ActivityThread的内部类:

       说明:该类是一个Binder类,即可实现跨进程通信。主要用于接受从AMS传递过来的消息,继而做相应处理。

具体流程

IPC过程:

双方都是通过对方的代理对象来进行通信。
1.app和AMS通信:app通过本进程的AMP和AMS进行Binder通信
2.AMS和新app通信:通过ApplicationThreadProxy来通信,并不直接和ActivityThread通信

参考函数流程

Activity启动流程(从Launcher开始):

第一阶段: Launcher通知AMS要启动新的Activity(在Launcher所在的进程执行)

第二阶段:AMS先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后,AMS会通知Launcher程序pause Activity(在AMS所在进程执行)

第三阶段: pause Launcher的Activity,并通知AMS已经paused(在Launcher所在进程执行)

第四阶段:检查activity所在进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity;不存在的话,会调用Process.start创建一个新进程(执行在AMS进程)

第五阶段: 创建ActivityThread实例,执行一些初始化操作,并绑定Application。如果Application不存在,会调用LoadedApk.makeApplication创建一个新的Application对象。之后进入Loop循环。(执行在新创建的app进程)

第六阶段:处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在AMS进程)

第七阶段: 加载MainActivity类,调用onCreate声明周期方法(执行在新启动的app进程)

  1. ActivityManagerProxy相当于Proxy
  2. ActivityManagerNative就相当于Stub
  3. ActivityManagerService是ActivityManagerNative的具体实现,换句话说,就是AMS才是服务端的具体实现!
  4. ApplicationThreadProxy相当于Proxy
  5. ApplicationThreadNative相当于Stub
  6. ApplicationThread相当于服务器端,代码真正的实现者!

Launch Mode

先来说说在ActivityInfo.java中定义了4类Launch Mode:

再来说说几个常见的flag含义:

最后再说说:设置FLAG_ACTIVITY_NEW_TASK的几个情况:

 

1、新的Activity类是通过类加载器方式即通过反射的方式生成的,我们可以看一下mInstrumentation.newActivity()方法:

 
  1. public Activity newActivity(ClassLoader cl, String className, Intent intent)

  2. throws InstantiationException, IllegalAccessException, ClassNotFoundException {

  3. return (Activity)cl.loadClass(className).newInstance();

  4. }

最后调用mInstrumentation.callActivityOnCreate()
 

2、在mInstrumentation.callActivityOnStart(this)方法里面就会显式调用Activtiy的onStart()方法!

到这里我们也可以基本解决第二个问题:Activity的生命周期方法是通过Instrumentation类调用callActivityOnXXX方法最终调用Activity的onCreate等方法,调用时机为ActivityThread#performLaunchActivitiy()方法中。

3、ActivityThread#performResumeActivity()
  --> Activity#performResume()
    --> Instrumentation#callActivityOnResume()
      --> Activity#onResume()
另外,观察执行handleResumeActivity()之后的代码,会发现程序会开始获取DecorView,执行addView()方法,里面最终会调用到ViewRootImpl#performTraversals(),即开始绘制view界面!
这里我们就解决了第三个问题:界面的绘制是在执行Activity#onResume()之后!

4、ActivityThread的main方法是在生成一个新的app进程过程中调用的,具体是通过与Zygote通信,之后通过RuntimeInit类采用反射的方式调用ActivityThread#main()方法,即生成app中的主线程(UI线程)!

 

内容引自如下:

https://blog.csdn.net/qinjuning/article/details/7262769

https://www.jianshu.com/p/dc6b0ead30aa

https://www.jianshu.com/p/274ccb315a7a

https://www.cnblogs.com/zl1991/p/6883517.html

https://www.cnblogs.com/ldq2016/p/6891009.html

https://blog.csdn.net/lj19851227/article/details/82562115​​​​​​​

https://www.jianshu.com/p/86ad1026cef3

标签:启动,流程,ActivityThread,Activity,进程,AMS,ActivityManagerService,Android
来源: https://blog.csdn.net/idaretobe/article/details/112485108