Activity生命周期和启动模式
- 启动Activity: onCreate()——onStart() ——onResume() ,Activity 进入运行状态。
- Activity退居后台:当前Activity转到新的Activity界面或者Home键回到主屏:onPause()——onstop(),进入停滞状态。
- Activity返回前台,onRestart()——onStart()——onResume(),再次回到运行状态。
- Activity退居后台,且系统内存不足,系统会杀死这个后台状态的Activity(此时这个Activity引用仍然处在任务栈中,只是这个时候引用指向的对象已经为null),若再次回到这个Activity,则会走onCreate()——onStart()——onResume()将重新走一次Activity的初始化生命周期。
- 锁屏 : onPause()——onStop()
- 解锁:onStart()——onResume()
Activity 启动模式
通过Acitivty的xml标签来改变任务栈的默认行为
- 使用android:launchMode=”standard|singleInstance|singleTask|singleTop”来控制Acivity任务栈。
任务栈是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其onDestory()方法。如果栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名.
- standard : 标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())都会执行。
- singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的onNewIntent()方法会被回调.如果Activity已经存在但是不在栈顶,那么作用与standard模式一样.
详细讲解SingleTop模式:
首先Module里有三个Activity 一个MainActivity 、ActivitySingleTop、ActivitySingleTask。每个页面包含三个Button 和一个textView。页面如下:
- 首先启动程序显示第一张图。日志如下(现在的顺序是MainActivity)
01-31 17:07:02.831 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onCreate()
01-31 17:07:02.831 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStart()
01-31 17:07:02.831 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onResume()
2.然后点击SingleTop启动SingleTop的Activity日志如下:(现在的顺序是MainActivity——ActivitySingleTop)
01-31 17:09:39.958 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
01-31 17:09:40.038 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onCreate()
01-31 17:09:40.038 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onStart()
01-31 17:09:40.038 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onResume()
01-31 17:09:40.559 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()
3.当SingleTop类型的Activity处于栈顶再次启动SingTop类型的自己运行的生命周期如下(在ActivitySingleTop 页面点击SingleTop button):(现在的顺序是MainActivity——ActivitySingleTop——ActivitySingleTop)
01-31 17:11:42.389 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onPause()
01-31 17:11:42.389 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onNewIntent()
01-31 17:11:42.389 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onResume()
当ActivitySingleTop处于栈顶,并且再次启动它,它执行了如下方法: onPause()、 onNewIntent()、onResume()
4.下面我们再来看它不在栈顶时的运行的情况。现在栈里只有MainActivity、ActivitySingleTop。所以现在我们需要在启动一个MainActivity。日志如下:
01-31 17:16:23.459 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onPause()
01-31 17:16:23.509 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onCreate()
01-31 17:16:23.509 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStart()
01-31 17:16:23.509 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onResume()
01-31 17:16:24.030 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onStop()
5.现在栈里面有三个activity 分别是MainActivity、ActivitySingleTop、MainActivity 。并且MainActivity处于栈顶。下面我们在来看下再次点击SingTop 按钮,也就是再起启动ActivitySingleTop看下运行情况:
01-31 17:19:14.181 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
01-31 17:19:14.251 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onCreate()
01-31 17:19:14.251 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onStart()
01-31 17:19:14.251 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onResume()
01-31 17:19:14.772 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()
如上可以看出不在栈顶时,ActivitySingleTop重新创建了,执行了onCreate、onStart、onResume,现在栈里面应该是有四个Activity 分别是: MainActivity、 ActivitySingleTop、MainActivity、ActivitySingleTop
到这里SingleTop模式说完了。
singleTask:栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.(clear top)
1.还是举上面的例子,一共有三个Activity,启动完MainActivity之后,启动ActivitySingleTask日志:
01-31 17:28:59.766 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
01-31 17:28:59.876 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onCreate()
01-31 17:28:59.876 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onStart()
01-31 17:28:59.876 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onResume()
01-31 17:29:00.377 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()
2.现在ActivitySingleTask处于栈顶,然后我们再一次启动它看看:
01-31 17:29:55.085 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onPause()
01-31 17:29:55.085 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onNewIntent()
01-31 17:29:55.085 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onResume()
当ActivitySingleTask 处于栈顶,并且再次启动它时方法执行时: onPause、 onNewIntent、onResume
3.在启动一个MainActivity 那么栈里有MainActivity、ActivitySingleTask、MainActivity,接着我们在来启动ActivitySingleTask看下执行日志:
02-01 08:22:38.135 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onNewIntent()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onRestart()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onStart()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onResume()
02-01 08:22:38.565 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()
02-01 08:22:38.565 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onDestroy()
当ActivitySingleTask没有处在栈顶时,再次启动它,运行的方法有:onNewIntent()——onRestart()——onStart()——onResume(),而在原来在它上面的MainActivity则会被销毁:运行的方法有:onPause()——onStop()——onDestroy()
到这里SingleTask模式介绍完毕了。
- singleInstance : 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了
- Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放在一个List里面.可以认为一个ActivityRecord就是一个Activity栈