Android应用启动、退出分析
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和应用的跨进程交互
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进程调用。
启动流程
这里以全新启动为例进行分析。
进程层次启动流程
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方法。
进程层次详细启动流程
进程层次,主要是应用进程启动和主线程启动流程。
这个流程比较复杂,需要注意的有几点:
1.Activity获取AMS的远程代理:ActivityManagerNative::getDefault,它返回的是代理ActivityManagerService的ActivityManagerProxy。
2.AMS通过ActivityStack和ActivityStackSupervisor管理Activity栈,实现Activity之间的切换。
3.ActivitStack对应生命周期的方法: xxxActivityLocked。(eg: startActivityLocked)
4.全新启动过程中,AMS只进行了Launch调度,没有进行Start和Resume调度。
应用层次详细启动流程
应用层次,主要是Activity的启动流程。
这里可以看到,Activity的create、start、resume直接在scheduleLaunch后面全部执行了。
退出流程
进程层次退出流程
1. 应用的退出,首页由Activity调用自身的finish。
2. 然后AMS调度应用Pause。
3. 应用Pause之后通知AMS。
4. AMS再调度应用Destroy。应用执行这个请求时,会先Stop,现进行Destroy。
进程层次详细退出流程
可以看到,AMS进行Pause和Destroy调度,没有进行Stop调度。
应用层次详细退出流程
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.app.ActivityThread$H){42deea58} null: 100
100: LAUNCH_ACTIVITY
无START_ACTIVITY和RESUME_ACTIVITY
可以看到AcitivyThread的H只收到一个LAUNCH的消息。
退出消息
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
原文链接:http://www.jianshu.com/p/72059201b10a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
Android应用启动、退出分析的更多相关文章
- android PakageManagerService启动流程分析
PakageManagerService的启动流程图 1.PakageManagerService概述 PakageManagerService是android系统中一个核心的服务,它负责系统中Pac ...
- Android app启动耗时分析
前言 app启动耗时过长的话,无论你的app里面的内容多么丰富有趣,作为一个用户,首先是没有耐心去等待的,如果我是一个用户,我会这样想:这是什么垃圾公司出的什么烂app,再等2s不进来就卸载,黑人问号 ...
- Cocos2d-x3.3RC0的Android编译Activity启动流程分析
本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2 ...
- Appium Android Bootstrap源码分析之启动运行
通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...
- Android ContentProvider 启动分析
对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...
- Android HandlerThread 源码分析
HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我又有一 个耗时任务需要执行,我们不得不重新创建线 ...
- Android的启动模式(下)
Android中的启动模式(下) 在这篇文章中,我会继续跟大家分享有关于Android中启动模式的相关知识.当然,如果对这个启动模式还不完全了解或者没有听过的话,可以先看看我之前写的有关于这个知识点的 ...
- Android 常用的性能分析工具详解:GPU呈现模式, TraceView, Systrace, HirearchyViewer(转)
此篇将重点介绍几种常用的Android性能分析工具: 一.Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗.当我们打开一个Activit ...
- (转)专项:Android 内存泄露实践分析
今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ; 原文链接:https://teste ...
- Android的logger机制分析
分析安卓的Logger机制 一.概述 Logger机制是在Android系统中提供的一个轻量级的日志系统,这个日志系统是以驱动程序的形式在内核空间实现的,在用户空间分别提供了Java接口和C/C++接 ...
随机推荐
- IceCTF 图片隐写
blue monday 下载一个文件,知道是MIDI文件,后缀改为.mid可以直接播放 一开始以为是两种乐器构成摩斯密码,后来在winhex里看字符发现了每一段的第一个字母恰好有flag的形式,于是提 ...
- 146. LRU缓存机制
题目描述 运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key ...
- 分布式版本控制系统GIT的使用
一.什么是Git Git是一个分布式版本控制系统,Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异(如CVS.Subver ...
- python程序编写中常见错误
1,NameError语法错误 s还没定义,给s赋值就行了 2,IndexError 索引错误 对于列表l1来说,只有4个元素,所以l1的Index只能是0-3,当你所输入的Index不在这范围,就会 ...
- 发布webservice之后调用不通
在websrvice发布文件的webconfig中加入 <httpRuntime maxRequestLength="102400" /> <webServic ...
- LINQ分页和排序,skip和Take 用法
LINQ分页和排序,skip和Take 用法 dbconn.BidRecord.OrderBy(p=>p.bid_id).ToList<BidRecord>().OrderBy(p ...
- H指数
H指数是用来综合衡量学者发表论文的数量和质量的指标,若某学者共发表N篇论文,H指数是指存在h 篇论文至少每篇有h 引用量,剩下的N-h篇中,每篇都不超过h引用量 计算H指数的方法:1.排序法思路:先将 ...
- [PHP]算法-最大子数组问题思路
最大子数组问题,股票价格示例: 1.在最高价格开始向左寻找之前的最低价格 2.在最低价格开始向右寻找之后的最高价格 3.暴力求解法,尝试每队可能的买进和卖出组合,保证卖出在买进之后 key buy s ...
- 【java工具】java常用工具
java反编译工具 可以将看不懂的.class文件转换成看得懂的.java文件,这样一来就能很方便的读懂别人编写的java代码. findbugs FindBugs-IDEA插件的使用 阿里巴巴Jav ...
- 【Java并发编程】6、volatile关键字解析&内存模型&并发编程中三概念
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...