Activity

ActivityThread

这个就是主线程,UI线程。
应用启动的时候会启动一个以包名为进程名的进程,这个进程会有这个ActivityThread线程。

Activity启动时涉及到的核心类

  • IActivityManager 这是本地进程调用到AMS进程(system_server)的Binder代理对象,具体的实现类是ActivityManagerService;本地进程是通过ActiviyManagerNative中的内部类ActivityManagerProxy调用AMS的具体实现的,而ActiviyManagerNative提供了ActivityManagerProxy的实例对象。

  • IApplicationThread

这个接口是为了AMS能够调用到应用进程的功能,从而控制应用进程以完成指定操作,那这样AMS也是需要有一个本地进程的Binder代理对象,这是就是ApplicationThreadProxy。

ActivityManagerService通过IApplicationThread接口管理应用进程,ApplicationThread类实现了IApplicationThread接口,实现了管理应用的操作,ApplicationThread对象运行在应用进程中,它其实是ActivityThread的内部类。

ApplicationThreadProxy对象是ApplicationThread对象在ActivityManagerService线程内的代理对象,ActivityManagerService通过ApplicationThreadProxy对象调用ApplicationThread提供的功能,比如让应用进程启动某个Activity。

  • ActivityManagerService ActivityManagerService管理Activity时,主要是如下几个类在起作用:
    • ProcessRecord:记录应用进程的信息;
    • ActivityStack:activity的堆栈
    • ActivityRecord:每次启动一个Actvity会有一个对应的ActivityRecord对象,表示Activity的一个记录
    • ActivityInfo:静态的activity的信息,比如启动模式等;
    • TaskRecord:Task记录信息,一个Task可能有多个ActivityRecord,但是一个ActivityRecord只能属于一个TaskRecord

详细的启动流程

1、 Activity调用到ActivityManagerService

Activity和ActivityManagerService是处在不同的两个进程中,它们之间的通过通过Binder完成。 Activity启动流程——1

  • 最开始是Launcher发出启动app的指令,触发Activity的startActivity等,所有的启动activity最后都是调用startActivityForResult
  • startActivityForResult会调用Instrumentation类的execStartActivity。这个类是对Activity的一个扩展的类,包括对ActivityResult、ActivityConfig和Activity生命周期。
  • execStartActivity调用IActivityManager中的startActivity,这只是个Binder的接口。IActivityManager的实现是在ActivityManagerNative中的内部类ActivityManagerProxy实现的,通过Binder的机制跟AMS进行通信,这样启动activity的请求就发给AMS,由AMS去完成下面的流程。

2、ActivityManagerService调用Zygote孵化出应用进程

ActivityManagerService运行在system_server进程中。 Activity启动流程——2

  • ActivityManagerProxy对象调用ActivityManagerService对象(运行在system_server进程)的startActivity方法以启动应用,startActivity方法接下来调用startActivityAsUser方法以启动应用。
  • startActivityAsUser会在ActivityStackSupervisorActivityStack里完成一些列的方法调用(并不是上图的所有流程都是在ActivityStack里完成的那样
    实际的过程应该是:

3、Zygote孵化出应用进程
zygote进程专用于孵化Android框架层和应用层程序的进程。 Activity启动流程——3 通过上面的已套流程逻辑,就为当前的app开启了一个新的进程。
这个进程会执行ActivityThread类的main方法

4、ActivityThread类main的逻辑 在main方法中,主要完成了2个任务:

  • 准备好UI线程的Looper和消息队列,进入loop循环;
  • ActivityThread的attach完成和AMS的通信,由AMS完成启动activity的任务。 Activity启动流程——4

5、ActivityManagerService的逻辑
这里的逻辑主要是AMS上的2个操作:

  • thread.bindApplication:将应用进程的ApplicationThread对象绑定到AMS
  • mMainStack.realStartActivityLocked:通知应用进程启动Activity 在第4步中,main中会调用:
    ActivityThread thread = new ActivityThread();
    thread.attach(false);
    

6、最后的启动过程
Activity启动流程——6

  • ActivityThread的handleLaunchActivity调用两个函数:
    • performLaunchActivity
    • handleResumeActivity
  • performLaunchActivity做了如下事情:
    • ActivityClientRecord信息的进一步校验
    • 实例化出Activity(反射实现)
    • 实例化出Application(已经实例化的就不需要了)
    • 创建Context环境
    • 将此Activityattach到Window上
    • 通过Instrumentation调用onCreate方法
    • 通过Instrumentation调用onStart方法
    • 通过Instrumentation调用onResotreInstanceState方法
    • 通过Instrumentation调用onPostCreate方法
  • handleResumeActivity做了如下事情:
    • 调用performResumeActivity 触发onResume方法
    • 添加到Window,界面显示

PS~~~~

在步骤2中,ActivityStackSupervisor中如果走到realStartActivityLocked,则下面的3、4、5的逻辑将不会都到,直接走到6;

启动流程的总结

在点击Launcher里的图标启动app时,会调用到AMS启动activity;在AMS发现这个应用还未启动过,即在linux系统中没有对应的进程时,它会调用Zygote进程去孵化出新的应用进程,这个进程会调用到ActivityThread的main方法;接下来通知AMS应用进程已经启动,AMS将应用进程绑定上;最后字词通过Binder调用到ActivityThread的handleLaunchActivity完成activity的启动;如果在AMS发现这个应用已经创建了进程,则直接启动activity了。

Activity Task的调度算法

TODO

results matching ""

    No results matching ""