Android4.4 Activity启动流程

2024-06-13 20:08

本文主要是介绍Android4.4 Activity启动流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、介绍

探索Android的应用程序Activity启动的流程,学习记录之用。

二、MainActivity启动流程

1、Launcher上点击启动应用程序的MainActivity

packages/apps/Launcher2/src/com/android/launcher2/AppsCustomizePagedView.java

当用户点击界面之后触发onClick

onClick ---> startActivitySafely

2 、packages/apps/Launcher2/src/com/android/launcher2/Launcher.java
frameworks/base/core/java/android/app/Activity.java
frameworks/base/core/java/android/app/Instrumentation.java
frameworks/base/core/java/android/app/ActivityManagerNative.java

startActivitySafely   (Launcher.java)
---> startActivity  (Activity.java)
---> startActivityForResult (Activity.java)
--->execStartActivity  (Instrumentation.java)
---> ActivityManagerNative.getDefault().startActivity (ActivityManagerNative.java)
通过一个ActivityManagerNative.getDefault()得到一个ActivityManagerNative代理对象,进而调用它的startActivity函数。

3、frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
在startActivity中发送一个 START_ACTIVITY_AS_USER_TRANSACTION命令,
       进而与activityManagerNative通信,调用函数startActivity(ActivityManagerService.java)
       startActivity --->startActivityAsUser
4、frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java

       startActivityAsUser
            ---> startActivityMayWait (ActivityStackSupervisor.java)
            --->  startActivityLocked
            --->  startActivityUncheckedLocked
5、frameworks/base/services/java/com/android/server/am/ActivityStack.java
           --->startActivityLocked (ActivityStack.java)
6、frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java
           --->resumeTopActivitiesLocked      (ActivityStackSupervisor.java)
7、frameworks/base/services/java/com/android/server/am/ActivityStack.java

            --->resumeTopActivityLocked   (ActivityStack.java)

           ---> pauseBackStacks(userLeaving);

8、frameworks/base/core/java/android/app/ApplicationThreadNative.java
           --->  prev.app.thread.schedulePauseActivity
      使用Binder通信:
             SCHEDULE_PAUSE_ACTIVITY_TRANSACTION 9、frameworks/base/core/java/android/app/ActivityThread.java
      启动函数:
            schedulePauseActivity
            sendMessage发送PAUSE_ACTIVITY
      调用函数:handlePauseActivity
            handlePauseActivity
                    --->performUserLeavingActivity        发送一个用户离开事件通知。
                    --->performPauseActivity                   调用当前Acitvity的onPause函数
                    --->QueuedWork.waitToFinish();      确保当前Activity下的写入磁盘之类操作完成
                    --->ActivityManagerNative.getDefault().activityPaused(token);
                                                                                     通知ActivityManagerService,当前的Activity已经Paused可以启动新apk的MainActivity了。


10、frameworks/base/core/java/android/app/ActivityManagerNative.java
         activityPaused
          使用Binder通信机制:
                       ACTIVITY_PAUSED_TRANSACTION
11、frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
          Binder启动函数:
          activityPaused
                --->stack.activityPausedLocked(token, false); 12、frameworks/base/services/java/com/android/server/am/ActivityStack.java          activityPausedLocked
                  --->completePauseLocked();
                 --->mStackSupervisor.resumeTopActivitiesLocked 13、
         frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java

               resumeTopActivitiesLocked                         ---> stack.resumeTopActivityLocked 14、frameworks/base/services/java/com/android/server/am/ActivityStack.java
         resumeTopActivityLocked
                   ---> startSpecificActivityLocked(next, true, true);

15、frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java
         startSpecificActivityLocked
                   --->realStartActivityLocked                     如果准备启动的这个应用程序进程是已经启动了的,那么直接启动这个应用程序的Activity。
                   --->mService.startProcessLocked       如果没有,就先创建该应用程序进程,然后再启动它。 

16、frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
                   --->startProcessLocked
                   --->startProcessLocked
                   --->Process.start("android.app.ActivityThread", 

17、frameworks/base/core/java/android/app/ActivityThread.java
                  ---> main
                  --->ActivityThread thread = new ActivityThread();
                  ---> thread.attach(false);                 attach--->
                       IActivityManager mgr = ActivityManagerNative.getDefault();
                       mgr.attachApplication(mAppThread); 

18、frameworks/base/core/java/android/app/ActivityManagerNative.java
            attachApplication
                   --->Binder通信到ActivityManagerServic
                   ---> attachApplication 

19、frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
           attachApplication
                    ---> mStackSupervisor.attachApplicationLocked 

20、frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java
          attachApplicationLocked
                   ----> realStartActivityLocked      开始启动用户点击应用程序的Activity。
                   ---->app.thread.scheduleLaunchActivity 

21、frameworks/base/core/java/android/app/ActivityThread.java
          scheduleLaunchActivity
                   ---->sendMessage(H.LAUNCH_ACTIVITY, r);
22、 frameworks/base/core/java/android/app/ActivityThread.java
               case LAUNCH_ACTIVITY: {
                            、、、、、、
                             handleLaunchActivity(r, null);
                             、、、、、、
                             break;
            }
           handleLaunchActivity
                       ---> performLaunchActivity          启动点击应用程序的Activity
                       ---> handleResumeActivity          将该Activity设置为Resume激活状态。            performLaunchActivity

                        ----> mInstrumentation.callActivityOnCreate          进而启动调用Activity的OnCreate函数
          handleResumeActivity
                        ----> 调用刚刚启动Activity的Resume函数
                         ActivityManagerNative.getDefault().activityResumed(token);
三、启动同一进程子Activity

         在该应用程序的MainActivity中启动位于同一个进程中的子Activity
         基本步骤和启动MainActivity差不多,差别在:
        1、通过Activity.startActivity()发送请求启动子Activity命令。
        2、直接启动子Activity
                      frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java                        void startSpecificActivityLocked(ActivityRecord r,
                                 boolean andResume, boolean checkConfig) {
                                          、、、、、、、、
                                          if(、、、){
                                                   、、、、、、、、
                                                    realStartActivityLocked(r, app, andResume, checkConfig);
                                         }else(、、、、){
                                                    、、、、、、、、
                                                    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                                                    、、、、、、、、
                                          }              
                          }
    因为在之前启动MainActivity的时候,已经使用了函数startProcessLocked来创建了进程,所以在这次启动子Activity的时候就直接使用函数:realStartActivityLocked。
    其他步骤,参考启动MainActivity的步骤。 三、启动不是同一进程子Activity

    在该应用程序的MainActivity中启动不是同一个进程中的子Activity 基本步骤和启动同一个进程的子Activity差别不大。也是在函数通过Activity.startActivity()来启动。

    在startSpecificActivityLocked调用的函数
                ---> mService.startProcessLocked         这个步骤和启动MainActivity相比,Android系统不需要创建新任务。
    frameworks/base/services/java/com/android/server/am/ActivityStack.java
                --->startActivityLocked(ActivityRecord r, boolean newTask,
                     

     boolean doResume, boolean keepCurTransition, Bundle options)
      newTask该标志位可以判断是Mainactivity还是新进程的子Activity

四、参考资料
Android源代码情景分析第七章:Activity组件启动过程

这篇关于Android4.4 Activity启动流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058294

相关文章

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla