Android应用启动、退出分析

时间:2021-07-31 13:56:56

http://www.jianshu.com/p/72059201b10a

§AMS和应用进程

§应用启动流程

§应用退出流程

§启动、退出消息

AMS和应用进程

应用进程 <- 系统管理 <- AMS

AMS:ActivityManagerService

系统级Service

管理应用进程的生命周期(包括进程的Activity、Service、Broadcast和Provider)

与应用进程的跨进程交互

Android的一个应用就是一个进程,系统对应用的管理是一个专门的Service——ActivityManagerService,简称AMS。

AMS是一个系统级Service。

系统通过它来管理应用进程的生命周期,当然包括应用的Activity、Service等的生命周期。

AMS是一个独立的进程,因此它要管理应用进程,必然要进行跨进程交互。

AMS和应用的跨进程交互

Android应用启动、退出分析
 

ActivityManagerProxy——AMS的代理,供应用进程调用。

通过ActivityManagerNative.getDefault()获取

ApplicationThreadProxy——应用进程的代理,供AMS进程调用。

应用启动时,会将应用进程的代理传递到AMS

跨进程通信,一般都会用到远程代理。这个后面会安排专题来讲。

简单来说,有进程A和进程B,进程B要调用进程A,那么A是Server端,B是Client端。AP是Server端的远程代理,代理AP和Server端拥有相同的调用接口。

进程B要调用进程A的接口f,直接调用代理的接口f,代理通过Binder机制通知进程A,唤起进程A相同接口f的调用。

ActivityManagerProxy是AMS的代理,供应用进程调用。

ApplicationThreadProxy是应用进程的代理,供AMS进程调用。

启动流程

这里以全新启动为例进行分析。

进程层次启动流程

Android应用启动、退出分析
 

1. 应用的启动是从其他应用调用startActivity开始的。通过代理请求AMS启动Activity。

2. AMS创建进程,并进入ActivityThread的main入口。在main入口,主线程初始化,并loop起来。

主线程初始化,主要是实例化ActivityThread和ApplicationThread,以及MainLooper的创建。ActivityThread和ApplicationThread实例用于与AMS进程通信。

3. 应用进程将实例化的ApplicationThread

Binder传递给AMS,这样AMS就可以通过代理对应用进程进行访问。

4. AMS通过代理,请求启动Activity。ApplicationThread通知主线程执行该请求。然后,ActivityThread执行Activity的启动。

Activity的启动包括,Activity的实例化,Application的实例化,以及Activity的启动流程:create、start、resume。

可以看到入口Activity其实是先于Application实例化,只是onCreate之类的流程,先于Activity的流程。

另外需要scheduleLaunchActivity,在ApplicationThreaad中,对应AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder线程中,它会向主线程发送消息,ActivityThread的Handler会调用相应的handleXXXActivity方法,然后会执行performXXXActivity方法,最终调用Activity的onXXX方法。

进程层次详细启动流程

Android应用启动、退出分析
 

进程层次,主要是应用进程启动和主线程启动流程。

这个流程比较复杂,需要注意的有几点:

1.Activity获取AMS的远程代理:ActivityManagerNative::getDefault,它返回的是代理ActivityManagerService的ActivityManagerProxy。

2.AMS通过ActivityStack和ActivityStackSupervisor管理Activity栈,实现Activity之间的切换。

3.ActivitStack对应生命周期的方法: xxxActivityLocked。(eg: startActivityLocked)

4.全新启动过程中,AMS只进行了Launch调度,没有进行Start和Resume调度。

应用层次详细启动流程

Android应用启动、退出分析
 

应用层次,主要是Activity的启动流程。

这里可以看到,Activity的create、start、resume直接在scheduleLaunch后面全部执行了。

退出流程

进程层次退出流程

Android应用启动、退出分析
 

1. 应用的退出,首页由Activity调用自身的finish。

2. 然后AMS调度应用Pause。

3. 应用Pause之后通知AMS。

4. AMS再调度应用Destroy。应用执行这个请求时,会先Stop,现进行Destroy。

进程层次详细退出流程

Android应用启动、退出分析
 

可以看到,AMS进行Pause和Destroy调度,没有进行Stop调度。

应用层次详细退出流程

Android应用启动、退出分析
 

Pause在AMS调度Pause之后完成。

Stop和Destroy在AMS调度Destroy后完成。

启动、退出消息

打印MainLooper消息

在Activity类加入静态代码块

static {

Looper.myLooper().setMessageLogging(newLogPrinter(Log.INFO, TAG));

}

MainLooper对应的Handler

−ActivityThread$H

−ViewRootImpl$ViewRootHandler

−…

上次已经讲过了,Activity的实例化是在主线程,因此Looper.myLooper()拿到的是MainLooper。设置MessageLogging,这样MainLooper的消息就可打印出来。

MainLooper对应的Handler比较多,与启动过程相关的是ActivityThread$H。

启动消息

Android应用启动、退出分析
 

全新启动时,主线程基本消息就是这些。

(android.app.ActivityThread$H){42deea58} null: 100

100: LAUNCH_ACTIVITY

Android应用启动、退出分析
 

无START_ACTIVITY和RESUME_ACTIVITY

可以看到AcitivyThread的H只收到一个LAUNCH的消息。

退出消息

Android应用启动、退出分析
 

Dispatching to Handler (android.app.ActivityThread$H) {42de80b0} null: 102

§102:PAUSE_ACTIVITY_FINISHING

Dispatching to Handler (android.app.ActivityThread$H) {42de80b0} null: 109

§109:DESTROY_ACTIVITY

文/kkmoving(简书作者)
原文链接:http://www.jianshu.com/p/72059201b10a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

Android应用启动、退出分析的更多相关文章

  1. android PakageManagerService启动流程分析

    PakageManagerService的启动流程图 1.PakageManagerService概述 PakageManagerService是android系统中一个核心的服务,它负责系统中Pac ...

  2. Android app启动耗时分析

    前言 app启动耗时过长的话,无论你的app里面的内容多么丰富有趣,作为一个用户,首先是没有耐心去等待的,如果我是一个用户,我会这样想:这是什么垃圾公司出的什么烂app,再等2s不进来就卸载,黑人问号 ...

  3. Cocos2d-x3&period;3RC0的Android编译Activity启动流程分析

    本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2 ...

  4. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

  5. Android ContentProvider 启动分析

    对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...

  6. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我又有一 个耗时任务需要执行,我们不得不重新创建线 ...

  7. Android的启动模式(下)

    Android中的启动模式(下) 在这篇文章中,我会继续跟大家分享有关于Android中启动模式的相关知识.当然,如果对这个启动模式还不完全了解或者没有听过的话,可以先看看我之前写的有关于这个知识点的 ...

  8. Android 常用的性能分析工具详解:GPU呈现模式&comma; TraceView&comma; Systrace&comma; HirearchyViewer(转)

    此篇将重点介绍几种常用的Android性能分析工具: 一.Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗.当我们打开一个Activit ...

  9. (转)专项:Android 内存泄露实践分析

    今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ;  原文链接:https://teste ...

  10. Android的logger机制分析

    分析安卓的Logger机制 一.概述 Logger机制是在Android系统中提供的一个轻量级的日志系统,这个日志系统是以驱动程序的形式在内核空间实现的,在用户空间分别提供了Java接口和C/C++接 ...

随机推荐

  1. win8&period;1 user profile service 服务登录失败

    在Win 8.1 上新建个用户后,不能登录. 出现 user profile service 服务登录失败. 无法加载用户配置文件. 网上大部分相同提示的问题是有关已有账号不能再次登陆的. 解决方式是 ...

  2. 40&period; 特殊a串数列求和

    特殊a串数列求和 #include <stdio.h> int main() { int i, a, n, item, sum, temp; while (scanf("%d % ...

  3. JAVA每日一记

    1.两个最基本的java回收算法:复制算法和标记清理算法                 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B.此为新生代最常用的算法            ...

  4. 与非CCR代码互操作

    导读:CCR可以轻松的承载STA组件或者与它互操作:组件应该创建一个只有一个线程的CCR Dispatcher实例,并且在Dispatcher的构造函数中指定线程套间策略.DispatcherQueu ...

  5. SKAction类

    继承自 NSObject 符合 NSCodingNSCopyingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framewo ...

  6. IOS成长之路-Nsstring中搜索方法rangeOfString

    NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1这个字符 ...

  7. DirectX:在graph自己主动连线中增加自己定义filter&lpar;graph中遍历filter&rpar;

    为客户提供的视频播放的filter的測试程序中,採用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791).因为不同的视频压缩 ...

  8. &lbrack;luogu3942&rsqb; 将军令

    题面 ​ 题目的意思大概是给你一棵n个点的树, 求最少需要多少个多少个点, 整棵树都被覆盖(覆盖的意思是所有离被选中的点距离不大于k的点都视作已覆盖). ​ 考虑贪心(其实我考试的时候以为是道树形dp ...

  9. Unity3D学习(九):C&num;和C&plus;&plus;的相互调用

    前言 不知不觉已经一年了,这一年来一直忙于公司项目疯狂加班,很少有自己的时间写下东西.不过好在项目最近也步入正轨了,正好抽空写点东西记录下学到的一些东西. 公司项目是一个端游IP移植手游,端游是基于C ...

  10. 李洪强iOS开发之iOS工具收集

    李洪强iOS开发之iOS工具收集 项目 简述 日期 我是怎么慢慢变懒的 : Jenkins + 蒲公英 使用Jenkins + 蒲公英使得项目打包给测试人员自动化,大大节省了劳动力 2015.04.1 ...