一般情况下

按下home键:前台Activity依次回调onPause, onStop;

按下back键:前台Activity依次回调onPause, onStop, onDestroy;

按下电源键:前台Activity依次onPause, onStop;

对于进程管理器,采用的force-stop的方式,也是直接强杀进程,并且连广播都会隔断。

为何我要强调是一般情况呢,

目前android应用市场比较混乱,各种应用商店,各种app,里面不乏有很多让手机后台大量消耗CPU,导致手机卡顿,或者在后台偷偷耗电、跑流量的应用。

**针对这些情况,国内各大手机厂商都会针对Android有不同程度的定制与优化。**这可能会导致那些一般情况的理论与实际有所不同。

比如系统有Low Memory Killer(低内存杀手),在手机内存比较紧张时会强杀应用,这也会导致Activity挂了,这是Android自带的机制。对于厂商,比如灭屏杀进程,那么这就可能导致按下电源键,Activity的生命周期就玩完了;另外,现在大多数App,拦截返回键功能,使其与home键效果一致,那么不排除有对返回键的极端优化情形。

(三) 横竖屏切换

在未做任何处理的情况,旋转后,Activity生命周期重新运行:onPause, onStop, onDestroy, onCreate, onStart, onRestoreInstanceState, onResume。

而目前,google版本的碎片化非常严重,而版本迭代快(今年5月份就能看到Android 7.0),在Android不断升级与完善的同时也新增不少功能,这就导致同一个功能也需要变更。

另外,还是前面的说的,对于configchange部分厂商会对其行为定制是完全可能的,屏幕的旋转后重走生命周期是比较卡的一个过程。

(四)launch mode

Activity启动模式有4种:standard、singleTop、singleTask和singleInstance。相关文章也很多,这里简单说下我的理解:

  • standard是默认方式,一个Task中可以有多个相同类型的Activity;
  • singleTop(字面理解单例栈顶),是指task栈顶只会有一个同类型的Activity;
  • singleTask(字面理解单例task),是指不只是栈顶,整个task只会有一个同类型的Activity;
  • singleInstance(字面理解单例实例):不只是整个task只会有一个同类型Activity,而且该task也只有这一个Activity;

对于Activity实例的单例要求是不断加强: standard < singleTop <singleTask < singleInstance

有了这些简单铺垫,再说下题主的问题**onNewIntent()**的触发时机是在启动Activity时却不需要创建新的Activity实例的情形下触发。 比如singleTop时,当再次启动task栈顶的Activity会触发;singleTask/singleInstance时,再次启动task的Activity会触发。

另外,对于一般App尽量少用singleTask和 singleInstance模式,可能会影响用户体验。

(五) 结束

建议题主,平时多看看google官方文档,看Android源码,多动手写demo程序。

通过打log来验证,留给有兴趣的不妨试试,finish()方法在onCreate,onStart,onResume等不同地方调用finish()后,Activity走的生命周期也是不同的。

2.基本结构

一个应用程序通常由多个Activity组成,那么在应用程序中肯定需要一个容器来盛放这些Activity,必要时通过该容器找到对应的Activity,并进行相关操作。上一篇文章已经讲过一个应用程序对应一个ActivityThread,所以自然而然地该容器是ActivityThread在负责维护,这个容器叫做mActivities,是一个数组,里面的每一项叫做ActivityRecord,一个ActivityRecord对应一个Activity

以上仅仅是应用级别的管理容器,但是很多场景下,系统需要找到某一个特定的Activity,并下发相关数据比如事件分发。所以还必须在系统层面再维护一个容器,这个容器存放在Activity Manager Service,对应的容器叫做mHistory,对应的每一项叫做HistroyRecord

每个Activity必须依靠在进程中,每个进程对应一个AMS中的ProcessRecord,通过这个ProcessRecord可以找到对应的应用的所有Activity,同时还提供了与Activity联系的接口IActivityThread

所以整个Activity的管理框架如下图所示:

android 强制display 1中的指定app_android

3.Activity启动过程

在Launch Activity时,AMS将对应的HistoryRecord作为token传递到客服端和客服端的Activity建立联系。在AMS中Activity状态变化时,将通过该联系找到客服端的Activity,从而将消息或者动作传递应用程序面对的接口:xxxActivity。整个Activity的启动过程大致可以分为以下几个步骤:

  • 发起startActivity(intent)请求
  • AMS接收到请求后,创建一个HistroyRecord对象,并将该对象放到mHistory数组中
  • 调用app.thread.scheduleLaunchActivity()
  • AMS创建ActivityRecord对象,将创建的Activity放入到ActivityRecord,再将其放入到mActivities
  • 发起ActivityonCreate()方法

对应的步骤如下图所示:

android 强制display 1中的指定app_移动开发_02

最后

关于题者说的**“中国开发者水平比美国低”**,国外开发者比较国内开发者的优势其实就是英文,那些技术博客、Android官网、公开课、Google开发者大会视频,我们其实是都可


以看到的,再者,国内这几年的Android技术博客和分享其实是很丰富的。

编码,要有一颗我自己可以搞得定的心,深追其中,专研问题的心。

多写代码!多读源码(RTFS)

关于学习资源:

如果你不知道怎么学习,我这里给大家提供一个方向,进行体系化的学习!

android 强制display 1中的指定app_开发者_03

除了上面的学习路线,还给大家整理了一份Android进阶学习资料,主要为安卓相关知识点及面试资料为主,在这个PDF中,通过详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。

帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这个PDF中有所收获。一些基础不好的,这里也有一份安卓基础资料包,帮助巩固基础。
识点,以及该知识点在项目中的实际应用。**

帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这个PDF中有所收获。一些基础不好的,这里也有一份安卓基础资料包,帮助巩固基础。