Activity的生命周期中分为三态度:运行态,暂停态和停止态;
1.运行态:
当Activity在屏幕的最前面,就是你可以看到的,有焦点的那个界面(有焦点:你可以在上面点击和触摸的,用户可以用来操作的).处于运行态的Activity,Android会尽可能的保持他的运行,即便出现了内存不足的时候,android系统也会先把栈底的Activity杀死,确保可见的Activity正常运行.
2.暂停态:
Activity对用户来说是可见的,但是失去焦点(用户不可以在这个Activity上面操作了),当内存不足的时候,这个暂态的Activity可能被杀死;
3.停止态:
当Activity处于完全不可见的时候,但是任保留着当前状态的和成员信息,当系统内存不足的时候,这个Activity就很容易被杀死.
Activity从一种状态转到另一种状态时会触发一些事件,执行一些回调方法来通知状态的改变,有如下的7个方法:
· void onCreate(Bundle savedInstanceState): 在创建时执行
· void onStart():可见的时候执行
· void onRestart():对到前台,再次可见时执行
· void onResume():获得焦点的时候执行
· void onPause():失去焦点的时候执行
· void onStop():用户不可见的时候执行
· void onDestory():销毁的时候执行
(有些同学可能会很头疼,这个要怎么去记呢?好难噢,现在我教大家一个方法:不要孤立的去记这7个方法,两个两个的去记忆)
创建-销毁 : onCreate() -onDestory()
可见-不可见:onStart()-onStop()
获得焦点-失去焦点:onResume()-onPause()
onRestart-onStart():这是在Activity回到前台的时候调用
(要是还是不太懂的结合下面这张图,一定要自己分析这张图的各个情况,在面试的时候经常会被问到,面试的时候也是经常拿这这图做文章,在后面我也会帮着同学去尽量的把能问的情况都分析一遍)
ps:怎么 去理解下面的这些情况呢:首先你一定要知道这七个方法中各自的含义是什么(可见还是不可见,失去还是获得焦点)
①从启动到关闭一个Activity 依次会执行:
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
(创建->可见->获得焦点->失去焦点->不可见->销毁)
②当Activity执行到onPause()方法失去焦点时,调用onResume()方法回到前台
③如果进程被杀死了,重新执行Activity时要从onCreate()方法开始执行
(只要进程被杀死,再想重新执行Activity时,就必须得重走onCreate(),这里的被杀死有自杀也有他杀;自杀:就是用户自己关掉程序时;他杀:由于系统内存不足被Android系统强制杀掉了Activity)
④当执行到onStop()方法Activity不可见,Activity再回到前台就得走 onRestart()->onStart()->onResume()
(ps:这里讲的可能比较抽象,同学们要自己去提取,联想他在手机中的实际操作,是怎么样的操作会导致执行到onStop()方法后还想去再回到前台:这也是同学们往后需要思考的地方,理论联系实际,这个在面试的时候:当你打开一个Activity ,此时你按Home键,接着又重新进入到这个应用,请问此时Activity的生命周期的怎么样的呢?调用了哪些方法呢?------这是一道很常见的面试题目)所以在往后的学习中同学要多加注意了:变得的问法,不变的是原理,记住那个图多出来的回去的线,那么不就都可以解决了.
怎么样在一个Activity里头看生命周期的是不是太简单了呢,接下来我举个例子:在多个Activity里头跳转看回调函数执行的方法(这里头以两个 Activity01,和Activity02为例子)
环境:在Activity01中添加一个Button跳转到Activity02,在log控制台的打印
①点击一个页面跳转到第二个页面
Activity01-----onCreate()
Activity01-----onStart()
Activity01-----onResume()
Activity01-----onPause()
Activity02-----onCreate()
Activity02-----onStart()
Activity02----onResume()
Activity01----onStop()
(当跳转到第二个页面,Activity01执行onPause()方法失去焦点,接着再执行Activity02的onCreate(),onStart(),onResume()此时Activity02的前台可见了,那么Activity01的前台就要不可见了,执行Activity01的onStop()方法)
②再从Activity02按返回键返回到Activity01
Activity02----onPause()
Activity01---onRestart()
Activity01---onStart()
Activity01---onResume()
Activity02---onStop()
Activity02---onDestory()
(单击返回键后,Activity02回先失去焦点,然后Activity01会执行onRestart(),onStart(),onResume()当Activity01获得焦点时,Activity02才onStop(),onDestory() 不可见 销毁)
总结下:当Activity01打开Activity02的时候,Activity01执行了onStop()方法(这个方法是在Activity02获得焦点的时候才会调用);当Activity02返回到Activity01时这是Activity01执行了onRestart(); 当两个Activity跳转的时候:Activity01会先失去焦点,让Activity02得到焦点,等到Activity02完全显示在前台的时候Activity01才会切换到后台
Activity的启动模式
Android采用任务栈的方式来管理Activity的实例,当启动一个应用的时候,Android就会创建一个任务栈,先启动的压入栈底(以先进后出的格式栈)
四种启动模式(standard模式,singleTop模式,singleTask模式,singleInstance模式):
(在AndroidManifest.xml中通过 <activity>标签的android:launchMode属性设置启动模式)
standard模式:
这个的android模式的启动模式,每当启动一个Activity系统就会把他压入任务栈中,并且将这个Activity压入栈顶,系统不会判断该Activity是否在栈中存在,每次都会创建一个新的实例
singleTop模式:(关键字:top,栈顶有则复用,无则再创建)
当启动的Activity已经在栈顶的时候,那么他就不会再创建一个新的Activity了,则可以直接使用他的实例不用再去创建了,但是但是这个只对栈顶有效, 这个Activity在第二位置时,此时还是会创建一个新的Activity压入栈中
singleTask模式:(关键字:有则将栈中其他没用的弹出直到要用的在栈顶,无则创建一个新的Activity并将其压入栈顶)
Activity在整个应用中值存在一个实例.每次启动Activity的时候,系统会判断该Activity的实例是否存在,有的话则将栈中其他Activity弹出栈,把这个要用的栈置于栈顶,没有的话则创建一个新的Activity并且将这个创建的新的压入栈顶
singleInstance模式:(和单例模式有点像)
在整个android系统只有一个实例,指定一个新的任务栈来管理这个Activity,无论从哪个任务栈中启动Activity都只会创建一个全新的任务栈来装载一个全新的Activity实例