一般情况下,Android中每个应用程序一开启就会创建一个任务栈,任务栈的ID是自增长的。最小化的时候,应用程序实际上是后台运行,任务栈是保留的。
- Standard 标准启动模式:这种模式下每开启一个新的Activity,都会被放置在任务栈的栈顶,不存在复用
- SingleTop 启动模式:这种模式下,如果栈顶已经存在了要开启的Activity,系统就不会重复创建了,而是利用这个已经存在的Activity,只复用栈顶的Activity
- SingleTask 启动模式:这种模式下,它要求当前Activity只会在任务栈存在一个实例,如果要开启的 Activity已经在任务栈中,系统会直接复用这个已经存在的Activity,并清空这个 Activity上面所有的栈引用,复用所有已存在的Activity
- SingleInstance 启动模式:这种模式下,系统会创建一个单独的任务栈,这个任务栈里只有它自己,并且在整个手机操作系统内存里,它是唯一的。比如打电话时的通话界面,全局唯一
然后是Activity的生命周期,被迫退出时的信息状态保存,返回键监听,Activity之间的数据传递等。
Activity的四种启动模式
Activity的四种启动模式:
1、Standard 标准启动模式
这种模式下每开启一个新的Activity,都会被放置在任务栈的栈顶,不存在复用。
2、SingleTop 启动模式
这种模式下,如果栈顶已经存在了要开启的Activity,系统就不会重复创建了,而是利用这个已经存在的Activity,只复用栈顶的Activity。
3、SingleTask 启动模式
这种模式下,它要求当前Activity只会在任务栈存在一个实例,如果要开启的 Activity已经在任务栈中,系统会直接复用这个已经存在的Activity,并清空这个 Activity上面所有的栈引用,复用所有已存在的Activity。
4、SingleInstance 启动模式
这种模式下,系统会创建一个单独的任务栈,这个任务栈里只有它自己,并且在整个手机操作系统内存里,它是唯一的。比如打电话时的通话界面,全局唯一。
Activity生命周期
Activity是Android组件中最基本也是最为常见用的四大组件之一,也是我们在开发过程之中接触最多的组件,所以了解Activity的生命周期,并正确的理解与应用,是必不可少的,下面就来介绍Activity生命周期。
Tips: AndroidStudio中通过logt可以快速生成TAG,logd、logv、logi、loge分别是打印不同级别日志的快捷键。
onCreate() :当Activity第一次创建时调用。该方法(如果有)会提供给你一个包含之前活动的冻结状态信息bundle包。
onStart():当Activity被展示在用户眼前时调用。如果活动出现在前台紧接着是onResume(),如果活动直接隐藏则紧接着是onStop()。
onResume():当Activity将开始与用户进行交互时调用。在这个时间点你的活动将会在活动堆栈的顶端,用户输入将会访问它。
onPause():当系统将要恢复一个之前的活动。这是一个有代表性的常常用于提交未被存储的改动信息为持久数据,停止动画和消耗CPU的东西等。实现该方法必须要特别的迅速,因为在此方法返回之前,下一个活动将不会恢复。如果活动将返回到前台则接下来调用onResume(),如果要隐藏到用户看不见的地方时,则调用onStop()。
onStop():当另一个活动被恢复且完全覆盖该活动,而该Activity将不在展示给用户时调用。这种情况将发生在一个新的活动将被开始,一个退出的活动将被恢复,又或者该活动将要被销毁。如果该活动将恢复与用户交互则调用onRestart(),如果该活动将被销毁则调用onDestory()。
onDestory():Activity被销毁钱最后一个被调用的方法。这个方法将会发生因为活动将会结束(在活动中调用finish()方法,或者系统临时销毁该实例节约空间。你可以使用isFinishing()方法区别这两种场景)。
从打开应用进入MainActivity再到返回键退出应用:
现在打开SecondActivity,那么MainActivity和SecondActivity的生命周期又是怎样的呢?
首先可以看到MainActivity进入暂停状态,然后SecondActivity进入初始化阶段(onCreate、onStart、onResume),SecondActivity完全展示在用户面前并且等待用户操作的时候,MainActivity才进入onStop()方法,所以即是Activity不再显示的时候才进行onStop。当返回MainActivity的时候,会执行onRestart() -> onStart() -> onResume()即途中最右边那一条路径,而SecondActivity先进入onPause,也是等MainActivity的onResme执行完成后才逐步销毁。
那么如果换成是DialogActivity呢?
可以看到,由于MainActivity并未完全被DialogActivity遮挡,所以并未进入onStop(),而是只进入了暂停状态(onPause),当退出DialogActivity后MainActivity直接执行onResume方法。所以当Activity未被完全遮挡会进入暂停状态,暂停恢复的时候,