ANR
(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。(https://www.cnblogs.com/android-blogs/p/5718302.html)
Activity的启动原理(https://www.jianshu.com/p/dbd75fc3b8ea)–》为什么ActivityThread里面Loop不会造成ANR
Activity:http://blog.csdn.net/zhaokaiqiang1992/article/details/49428287
http://blog.51cto.com/laokaddk/1206840
http://www.cloudchou.com/android/post-805.html(深入理解Activity启动流程4篇)

概念:
• ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期
• ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作
• ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
• ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
• Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
• ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
• ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
• TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。

Zygote
zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。
在Android系统里面,zygote是一个进程的名字。Android是基于Linux System的,当你的手机开机的时候,Linux的内核加载完成之后就会启动一个叫“init“的进程。在Linux System里面,所有的进程都是由init进程fork出来的,我们的zygote进程也不例外。
我们都知道,每一个App其实都是:一个单独的dalvik虚拟机;一个单独的进程
所以当系统里面的第一个zygote进程运行之后,在这之后再开启App,就相当于开启一个新的进程。而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式,是通过fork第一个zygote进程实现的。所以说,除了第一个zygote进程,其他应用所在的进程都是zygote的子进程。

Systemserver
首先我要告诉你的是,SystemServer也是一个进程,而且是由zygote进程fork出来的。
知道了SystemServer的本质,我们对它就不算太陌生了,这个进程是Android Framework里面两大非常重要的进程之一——另外一个进程就是上面的zygote进程。
为什么说SystemServer非常重要呢?因为系统里面重要的服务都是在这个进程里面开启的,比如
ActivityManagerService、PackageManagerService、WindowManagerService等等,看着是不是都挺眼熟的?
那么这些系统服务是怎么开启起来的呢?
在zygote开启的时候,会调用ZygoteInit.main()进行初始化
AMS
客户端:ActivityManagerProxy =====>Binder驱动=====> ActivityManagerService:服务器

ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命周期。
ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启的时候,就会初始化ActivityManagerService
你是否会好奇,我为什么说AMS是服务端对象?下面我给你介绍下Android系统里面的服务器和客户端的概念。
其实服务器客户端的概念不仅仅存在于Web开发中,在Android的框架设计中,使用的也是这一种模式。服务器端指的就是所有App共用的系统服务,比如我们这里提到的ActivityManagerService,和前面提到的PackageManagerService、WindowManagerService等等,这些基础的系统服务是被所有的App公用的,当某个App想实现某个操作的时候,要告诉这些系统服务,比如你想打开一个App,那么我们知道了包名和MainActivity类名之后就可以打开
我们的App通过调用startActivity()并不能直接打开另外一个App,这个方法会通过一系列的调用,最后还是告诉AMS说:“我要打开这个App,我知道他的住址和名字,你帮我打开吧!”所以是AMS来通知zygote进程来fork一个新进程,来开启我们的目标App的。这就像是浏览器想要打开一个超链接一样,浏览器把网页地址发送给服务器,然后还是服务器把需要的资源文件发送给客户端的(很形象)。
知道了Android Framework的客户端服务器架构之后,我们还需要了解一件事情,那就是我们的App和AMS(SystemServer进程)还有zygote进程分属于三个独立的进程,他们之间如何通信呢?
App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信。
那么AMS有什么用呢?在前面我们知道了,如果想打开一个App的话,需要AMS去通知zygote进程,除此之外,其实所有的Activity的开启、暂停、关闭都需要AMS来控制,所以我们说,AMS负责系统中所有Activity的生命周期。
在Android系统中,任何一个Activity的启动都是由AMS和应用程序进程(主要是ActivityThread)相互配合来完成的。AMS服务统一调度系统中所有进程的Activity启动,而每个Activity的启动过程则由其所属的进程具体来完成。

1.框架层理解Activity生命周期

2.主要类图调用:

上面类图关系中包含两个进程,一个是应用程序进程,另一个是AMS进程,所以会涉及到进程间通信,android进程间通信用的是Binder通信。
Activity启动时的概要交互流程如下图如下所示:

2.1客户进程
ActivityThread
可以看到该类有一个main方法,其实它是android一个应用程序的入口,每启动一个应用进程,都会创建ActivityThread与之对应的实例,是应用程序的UI线程,Android进程启动时会建立消息循环。负责管理应用程序的生命周期,执行系统广播及其ActivityManagerService请求执行的操作。属于客户端对象。
ApplicationThread&ApplicatinThreadNative
ApplicationThread用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread与ActivityThread通讯,ApplicationThreadNative是ApplicationThread在客户端的实现。
ApplicationThreadProxy
ApplicationThreadProxy是ApplicationThread在服务器端的代理。负责和服务器端的ApplicatingThreadNative通讯。
AMS就是通过该代理与ActivityThread进行通信的。
Activity& Intrumentation
Activity是应用程序真正做事情的类,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation。通俗的理解,Instrumentation与ActivityThread的区别,前者像是一个“家庭”里的“管家”,后者是负责创建这个“家庭”,并负责对外打交道,比如接收AMS的通知等。
2.2 AMS进程
这里说的AMS进程,实际指的是Systemserver进程,Systemserver进程起来的时候启动AMS服务,AMS实际是ActivityManagerService的缩写。
ActivityManagerService
管理Activity的生命周期
ActivityManagerNative
ActivityManagerService在服务器端的实现,客户端的请求调用ActivityManagerProxy后,通过IBinder,最终会在ActivityManagerNative中实现。ActivityManagerNative再通过调用ActivityManagerService的相关功能,以完成客户端请求。
ActivityManagerProxy
ActivityManagerService的在客户端的代理。负责和服务器端的ActivityManagerNative通讯。
ActivityStack
Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
ActivityRecord
ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord来记录Activity的状态以及其他的管理信息。
TaskRecord
AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。
ProcessRecord
一个Apk文件运行时会对应一个进程,ProcessRecord正是记录一个进程中的相关信息。

“任务” Task
实际开发中,我们的App是由多个Activity构成的,为了能够管理Activity,Android为我们提供了Task的概念,默认情况下一个应用的所有Activity是管理在一个Task中的。 Task是一种Stack类型的数据结构,启动App会创建一个Task,Activity特性设置MainLauncher = true或者AndroidManifest中配置了Main和Launcher的Activity会被压入栈中,新启动的Activity会执行入栈操作,关闭的Activity执行出栈操作

注意:一个虚拟机只能跑一个进程,一个进程里可以跑多个应用,一个应用也可以跑在多个进程中,这就是他们的关系。(https://www.cnblogs.com/franksunny/archive/2012/04/17/2453403.html)
3 startActivity流程
启动一个Activity有两种方式,一种就是通过Launcher,另外一种是通过程序代码调用startActivity函数实现(验证过AppWidget其实与这种方式是一致的)
launchMode的四种方式,launchMode方法是在apk的manifest文件中针对每一个Activity的android:launchMode属性进行设置的方式,共有四种模式可以设置,分别是standard、singleTop、singleTask、singleInstance。Activity总共有四种启动模式,即上。

在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程。启动Android应用程序中的Activity的两种情景,第一,在android设备屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来,这种启动方式的特点是会启动一个新的进程来加载相应的Activity。第二,应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。在Android的Activity管理机制中,当退出Activity的时候,在某些情况下并没有立即把该Activity杀死,而是将其暂时保存起来,当第二次调用startActivity启动该Activity的时候,就不需要再创建该Activity的实例,直接恢复Activity即可。

图中详细给出了Activity整个生命周期的过程,以及在不同的状态期间相应的回调方法。(https://www.cnblogs.com/lwbqqyumidi/p/3769113.html)
图中需要注意一下几点:
1.Activity实例是由系统自动创建,并在不同的状态期间回调相应的方法。一个最简单的完整的Activity生命周期会按照如下顺序回调:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。称之为entire lifetime。
2.当执行onStart回调方法时,Activity开始被用户所见(也就是说,onCreate时用户是看不到此Activity的,那用户看到的是哪个?当然是此Activity之前的那个Activity),一直到onStop之前,此阶段Activity都是被用户可见,称之为visible lifetime。
3.当执行到onResume回调方法时,Activity可以响应用户交互,一直到onPause方法之前,此阶段Activity称之为foreground lifetime。
在实际应用场景中,假设A Activity位于栈顶,此时用户操作,从A Activity跳转到B Activity。那么对AB来说,具体会回调哪些生命周期中的方法呢?回调方法的具体回调顺序又是怎么样的呢?
开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。
当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。
此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。
至此,Activity栈中只有A。在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。我们先直接看下实验结果:
此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。
此时如果按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。
此时如果长按Home键,不同手机可能弹出不同内容,Activity生命周期未发生变化(由小米,不知道其他手机是否会对Activity生命周期有影响)。
Activity管理机制

Activity理解相关推荐

  1. Activity生命周期详解及最佳实践

    前言 该文章来自一个开源项目,致力于翻译Google官方文档,很棒,已经有成果了.PDF版本可以去这里下载http://hukai.me/eBooks/AndroidTrainingCHS.pdf,以 ...

  2. 关于Activity 使用方法详解

    一.Activity 概览 Activity是Android最基本的四大组件之一(Activity 活动,Service 服务,ContentProvider内容提供者,BroadcastReceiv ...

  3. 重拾Activity(三)Activity知识

    这篇文章是从安卓开发者文档找到的Activity资料进行整理的(篇幅较长,用于个人回顾) 目录 这篇文章是从安卓开发者文档找到的Activity资料进行整理的(篇幅较长,用于个人回顾) Activit ...

  4. Activity 使用方法详解

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.Activity 概览 二.Activity 生命周期 三.Activity 的注册方法 四.App ...

  5. Android Studio :1、连接手机调试(超级详细;附带连接测试录像);2、点击Button按钮,显示Toast中的内容

    手机端 视频 演示:[视频地址:https://live.csdn.net/v/18079] SVID_20200218_211351_1.mp4 操作环境: 电脑(Windows 10 教育版): ...

  6. Android应用的基本组件介绍

    Android应用的基本组件介绍 Activity和View Activity是Android应用中负责与用户交互的组件--大致上可以把它想象成Swing变成中的JFrame控件.不过它与JFrame ...

  7. java mvc mvp_一篇文章让你彻底了解 MVC、MVP 、MVVM

    MVC MVC全名是Model--View--Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的 ...

  8. Android面试题解答(结尾有彩蛋)

    用于面试参考,不做深究.答案整理自互联网,也会加上我自己的理解. 说说Activity的启动流程 Activity启动有几种方式?一种是写一个startActivity,第二种是点击手机App,通过手 ...

  9. 基于android的资源文件管理器

    软 件 学 院 毕业实训报告 课题名称: android资源管理器 专 业: 软件设计(游戏开发方向) 班 级: 学 号: 学生姓名: 指导教师: 年 月 日 摘 要 相信大家对Android的发展历 ...

最新文章

  1. 超大数据下大批量随机键值的查询优化方案
  2. Java设计模式—模板方法模式
  3. Java对象转JSON时如何动态的增删改查属性
  4. NFL原则告诉我们做决策的时候,试图找到一个能解决所有问题,“大而全”的方案是不存在的。我们应当找到最关心的问题,因地制宜做出选择。——聚焦目标,取舍有道!...
  5. PyTorch基础(part1)
  6. Facade(外观)--对象结构型模式
  7. 网易易盾的“外挂对抗战”,游戏出海之路如何走得更安全?
  8. c语言函数返回数组_C语言如何用一维数组拷贝函数,拷贝二位数组(C Primer Plus 10-7)...
  9. 关于空间复杂度,你可能有几个疑问?
  10. UIView中的坐标转换
  11. 使用idea工具进行反编译
  12. 高德地图——输入经纬度查找
  13. Java+Springboot+Mybatis+Mysql+Bootstrap+Maven实现景区旅游管理系统
  14. 前端 | 表格(table)的合并
  15. AI软件编辑文字时出现“滚滚长江东逝水”解决方法
  16. 机械臂抓取学习笔记二
  17. vue3+vite2多页面多路由 注意
  18. 1000个已成功入职的软件测试工程师简历经验总结:软件测试工程师简历项目经验怎么写?(含真实简历模板)
  19. iOS 免审核更换图标
  20. 围棋口诀两百句(转)

热门文章

  1. html 网页播放音乐
  2. C语言2009年慈溪最大的数,2009年慈溪市初二数学竞赛试题+答案
  3. 统计报表指的是什么?有什么专业的报表制作软件?
  4. 抽奖概率 php_php抽奖概率算法
  5. 基于matlab的信号合成与分解,基于Matlab周期信号的分解与合成
  6. c盘明明没装什么东西却爆满怎么办?
  7. linux的驱动模块,ubuntu linux 驱动模块的使用
  8. CentOS6.8安装python3.8
  9. Windows server 2003 怎么安装ACHI驱动?
  10. 如何调用天气接口(如何解决WebService客户端引用 服务器无法处理请求。 未将对象引用设置到对象的实例)