Android源码个个击破之Context和Activity的启动流程

 context的初始化过程:https://www.jianshu.com/p/7d4b605f5060

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

        系统级别的Context实例化过程:

        SystemServer的run方法中,调用createSystemContext方法

        image.png

        通过ActivityThread的systemMain方法创建了一个系统级别的ActivityThread

        image.png

        调用activityThread的attach方法,传入true。

        该方法创建了application并调用了onCreate方法。

       image.png

      以上是系统级别的context实例化过程,为了弄清activity这个context是如何实例化的,就得研究一下activity的启动过程。https://blog.csdn.net/qq_23547831/article/details/51224992

      需要注意的是activity,service启动activity的过程都各不一样,activity复写了startActivity方法,service直接调用了父类的方法。

     activity之所以要复写startActivity方法,是为了复用activity独有的startActivityForResult方法。

      最终都会调用到Instrumentation的启动activity方法,再调用ActivityManagerNative

      image.png

     

        image.png

        

 很明显,启动activity使用了binder。

    这个"activity"为key的service是何时添加的呢?

    我尝试着在SystemServer里找,但是没有找到。在ActivityManagerService自身的代码里找到。而setSystemProcess在SystemServer里被调用。

       image.png

     image.png

    

ActivityManagerService的实例是怎么创建出来的呢?

image.png

 

 image.png

     

上面根据字节码反射创建了service的实例,实例实际是ActivityManagerService的内部类:Lifecycle.

  image.png


image.png

调用了image.png


getService方法得到了真正的ActivityManagerService.

image.png

  调用了service的onStart方法。

  

  上面说了这么多,关于ActivityManagerService创建的过程。      

  但是疑问尚在:

  1)activity怎么就具备了context的特性了,它也没有new,怎么使之成为一个context。

  2)startActivity怎么android系统就会弹出一个界面


 前面image.png

 开启activity,最终会通过Binder机制(数据传输机制比较麻烦,后面研究)跨进程调用

  ActivityManagerServcie的startActivityAsUser方法:

image.png

继而调用ActivityStarter的startActivityMayWait方法

image.png

在方法中又会调用到startActivityLocked方法

image.png


方法最后会调用到 startActivityUnchecked方法

image.png


最终调用了ActivityStack的startActivityLocked方法:

 image.png


注意下面这部分代码,不同版本的源码会有很大的区别。

 

1)首先判断开启的activity是否是新任务,分别做不同的处理。

image.png



  2)主要是调用WindowManager

    ***准备事务

    ***添加token

image.png


调用WindowManagerService的H来发送消息


image.png


注意ensureActivitiesVisibleLocked这个方法

image.png

接着方法调用顺序:

  makeVisibleAndRestartIfNeeded (ActivityStack)

  startSpecificActivityLocked (ActivityStackSupervisor)

  realStartActivityLocked (ActivityStackSupervisor)

  此方法内部会调用 app.thread.scheduleLaunchActivity,这个app.thread是IApplicationThread类的实例,具体的子类是哪个呢?

  下面的源码为API26


  app即Proce***ecord类

image.png

  在里面搜索thread的set方法:
  image.png

  makeActive点击发现有2处引用:

  引用1:

   image.png

  

   image.png

  

  image.png


  引用2:

  image.png

  找到上一个调用的地方

image.png

 

  image.png

 

  由上面的分析可知:app.thread的thread是ActivityThread

  下面看它的scheduleLaunchActivity方法,看它是如何启动Activity的:

   1)发送消息给H这个Handler

   image.png

 2)handler的处理

   image.png

  

   实例化了Activity的对象:

   image.png

  通过Instrumentation的newActivity方法创建了Activity的实体:
  image.png

  image.png

  




猜你喜欢

转载自blog.51cto.com/4259297/2162106