Activity启动流程源码分析之startActivity启动(三)
来源:互联网 发布:淘宝卖家怎么发货啊 编辑:程序博客网 时间:2024/05/19 13:43
1、前述
在上一篇文章中我们已经详细的阐述了通过Launcher图标启动Activity的流程Activity启动流程源码分析之Launcher启动(二)。由于是第一次创建Activity,所以会新创建进程,而在Activity启动流程源码分析之入门(一)文章中我们也说了,Activity的启动方式有两种,另外一种就是我们今天要说的startActivity启动方法。
好啦,话不多说,我们直接进入今天的主题,首先我们来看一下时序图。
2、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启动方式的不同点在哪里?
首先就是启动开始的位置不同,Launcher是从Launcher.startActivitySafely()方法开始启动的,而Activity是从Activity.startActivity()方法开始的。
当执行到上一篇文章的(26)步骤ActivityStackSupervisor.startSpecificActivityLocked()方法时,Launcher方式会选择创建新的进程,进入ActivityManagerService.startProcessLocked()方法,而Activity内部启动的Activity是进入ActivityStackSupervisor.realStartActivityLocked()方法。
好啦,接下来我们和之前一样将上面的流程总结一下。
4、总结
由于和前一篇博客的内容差不多,所以这里就不做详细的步骤介绍了,唯一的区别就是在Activity内部启动Activity时无需启动新的进程。
好啦,到此整个Activity的启动流程我们分三篇博客也就说完啦!在此勉励一下自己再接再厉,加油!
- Activity启动流程源码分析之startActivity启动(三)
- Activity启动流程源码分析之Launcher启动(二)
- Android源码解析之应用程序内部启动Activity过程(startActivity)的源代码分析
- Activity启动流程源码分析之入门(一)
- Activity 启动流程,源码分析
- Activity启动流程(源码分析)
- Activity的启动过程之startActivity源码解析
- 从 startActivity 看activity启动流程
- Android进阶系列之源码分析Activity的启动流程
- Android 源码分析之——Activity启动流程
- 《android framework常用api源码分析》之Activity启动流程
- 【OpenStack源码分析之三】Nova-Compute启动流程分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- Android中启动Activity(startActivity)流程图分析
- 安卓手机最有趣的功能揭秘 手机达人的你却未必知道!
- 关于用堆栈实现中后缀表达式计算的问题
- Spring Boot MyBatis 通用Mapper插件集成
- mysql 外键说明与实例
- View动画、Drawable动画、Property动画介绍
- Activity启动流程源码分析之startActivity启动(三)
- Linux~
- RAID详解[RAID0/RAID1/RAID10/RAID5]
- 轻松教你几招 安卓手机再也不会卡了
- 笔试题汇总
- UE4纯蓝图添加C++遇到的一个坑
- 原生安卓系统越来越流畅,为啥国产手机还要定制UI?
- HC-SuK070-C【通信口配置】之CAN
- 使用java代码来打印杨辉三角形图案