返回

Android中Activity启动流程后篇

Android

好的,我将为您撰写一篇名为《Android中Activity启动流程后篇》的博文,以下是该博文的内容:

正文

在Android Q中,从Android Framework层通过Binder的方式调用到应用进程启动Activity的相关流程如下:

  1. Android Framework中的ActivityManagerService接收到启动Activity的请求后,会创建一个新的Intent对象,并将需要启动的Activity的组件名(ComponentName)添加到Intent中。
  2. ActivityManagerService将创建的Intent对象通过Binder接口发送给应用进程中的ActivityManager,即ActivityManagerProxy对象。
  3. ActivityManagerProxy接收到Intent对象后,会调用ActivityThread的handleLaunchActivity方法来处理启动Activity的请求。
  4. handleLaunchActivity方法会创建一个新的ActivityRecord对象,并将启动Activity的Intent对象添加到ActivityRecord对象中。
  5. handleLaunchActivity方法还会创建一个新的ActivityClientRecord对象,并将ActivityRecord对象添加到ActivityClientRecord对象中。
  6. handleLaunchActivity方法会将ActivityClientRecord对象添加到ActivityManager的mActivities集合中。
  7. handleLaunchActivity方法会调用ActivityThread的scheduleLaunchActivity方法来安排启动Activity。
  8. scheduleLaunchActivity方法会将ActivityRecord对象添加到ActivityThread的mActivitiesReadyForService集合中。
  9. ActivityThread的main方法会不断的轮询mActivitiesReadyForService集合,如果集合中有ActivityRecord对象,则会调用ActivityRecord对象的performLaunchActivity方法来启动Activity。
  10. performLaunchActivity方法会调用ActivityThread的attachApplication方法来附加应用进程的Application对象。
  11. attachApplication方法会调用ActivityThread的installActivity方法来安装Activity。
  12. installActivity方法会调用Activity的attach方法来附加Activity到ActivityThread。
  13. attach方法会调用Activity的onCreate方法来创建Activity。
  14. onCreate方法会调用Activity的setContentView方法来设置Activity的布局。
  15. setContentView方法会调用Activity的findViewById方法来获取布局中的控件。
  16. findViewById方法会调用View的findViewById方法来获取控件。
  17. View的findViewById方法会调用ViewRootImpl的findViewById方法来获取控件。
  18. ViewRootImpl的findViewById方法会调用View的dispatchFindViewById方法来获取控件。
  19. dispatchFindViewById方法会调用View的findViewTraversal方法来获取控件。
  20. findViewTraversal方法会调用View的findViewByIdInner方法来获取控件。
  21. findViewByIdInner方法会调用View的dispatchFindViewByIdRecursive方法来获取控件。
  22. dispatchFindViewByIdRecursive方法会递归的调用子View的dispatchFindViewByIdRecursive方法来获取控件。
  23. 当找到控件后,View的findViewById方法会返回控件。
  24. setContentView方法会将获取到的控件设置为Activity的布局。
  25. onCreate方法会调用Activity的onStart方法来启动Activity。
  26. onStart方法会调用Activity的onResume方法来恢复Activity。
  27. onResume方法会调用Activity的onPostResume方法来完成Activity的恢复。

基于中篇所介绍的启动Activity的流程进行进一步的延伸,可以总结出以下几点:

  • Android Q中启动Activity的流程与Android P基本相同,只是在细节上有一些差异。
  • Android Q中启动Activity的流程可以分为三个阶段:
  1. Android Framework层启动Activity的阶段。
  2. 应用进程中启动Activity的阶段。
  3. Activity的启动阶段。
  • Android Q中启动Activity的流程涉及到多个组件,包括ActivityManagerService、ActivityManager、ActivityThread、ActivityRecord、ActivityClientRecord等。
  • Android Q中启动Activity的流程是异步的,即Activity的启动过程不会阻塞UI线程。

总结

本文主要介绍了Android Q上从Android Framework层通过Binder的方式调用到应用进程启动Activity的相关流程,以及基于中篇介绍的启动Activity的流程进行进一步的延伸。