Activity启动流程源码分析之startActivity启动(三)

来源:互联网 发布:淘宝卖家怎么发货啊 编辑:程序博客网 时间:2024/05/19 13:43

1、前述

在上一篇文章中我们已经详细的阐述了通过Launcher图标启动Activity的流程Activity启动流程源码分析之Launcher启动(二)。由于是第一次创建Activity,所以会新创建进程,而在Activity启动流程源码分析之入门(一)文章中我们也说了,Activity的启动方式有两种,另外一种就是我们今天要说的startActivity启动方法。

好啦,话不多说,我们直接进入今天的主题,首先我们来看一下时序图。

2、Activity启动流程时序图

Activity启动流程时序图

与之前的Launcher启动方式相比,这里主要就是缺少了启动新进程的步骤,所以接下来我们重点展示两种启动方式的不同点。

3、启动流程说明

说明:由于本篇博客大部分步骤和Activity启动流程源码分析之Launcher启动(二)相同,所以在此只展示不同点,相同的步骤请参考之前的文章。

(1)应用程序的入口是从Activity.startActivity()开始的。

(2)上一篇文章的(26)步骤ActivityStackSupervisor.startSpecificActivityLocked()方法执行不同。

void startSpecificActivityLocked(ActivityRecord r,            boolean andResume, boolean checkConfig) {        // Is this activity's application already running?        ProcessRecord app = mService.getProcessRecordLocked(r.processName,                r.info.applicationInfo.uid, true);        r.task.stack.setLaunchTime(r);        //app对象不为null,所以if条件成立,进入条件后执行realStartActivityLocked方法,并且直接return        if (app != null && app.thread != null) {            try {                //......                realStartActivityLocked(r, app, andResume, checkConfig);                return;            } catch (RemoteException e) {               //......            }        }        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,                "activity", r.intent.getComponent(), false, false, true);    }

由于这里不是第一次启动Activity,所以通过mService.getProcessRecordLocked()方法取回的app对象不为null,所以这里直接进入realStartActivityLocked方法,不会执行startProcessLocked方法,所以这里不需要创建新的进程。

(3)ActivityStackSupervisor.realStartActivityLocked()

直接执行到realStartActivityLocked的方法,这一步与上一篇文章的(32)步相同,以下步骤和上一篇相同。

这样,应用程序内部的Activity就被启动起来了,我们回顾一下与Launcher启动方式的不同点在哪里?

  1. 首先就是启动开始的位置不同,Launcher是从Launcher.startActivitySafely()方法开始启动的,而Activity是从Activity.startActivity()方法开始的。

  2. 当执行到上一篇文章的(26)步骤ActivityStackSupervisor.startSpecificActivityLocked()方法时,Launcher方式会选择创建新的进程,进入ActivityManagerService.startProcessLocked()方法,而Activity内部启动的Activity是进入ActivityStackSupervisor.realStartActivityLocked()方法。

好啦,接下来我们和之前一样将上面的流程总结一下。

4、总结

由于和前一篇博客的内容差不多,所以这里就不做详细的步骤介绍了,唯一的区别就是在Activity内部启动Activity时无需启动新的进程。

好啦,到此整个Activity的启动流程我们分三篇博客也就说完啦!在此勉励一下自己再接再厉,加油!

0 0
原创粉丝点击