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组件启动过程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值