Activity是Android四大组件之一,其主要功能是与用户交互,向用户显示内容,接收用户输入(点击,滑动),可以说Activity是四大组件中最重要的组件(当然了,其他3个组件也很重要)。那么掌握activity的生命周期就显得很有必要。比如初始化动作适合在哪里做,什么时候该释放资源。点击back和home,activity会发生怎样的变化,两者有什么不同。横竖屏切换的时候,activity生命周期是怎样的。activity弹出dialog,生命周期会发生变化吗?......
带着这些疑问,接下来我们就一块学习下,首先我们先看下都有哪些常见的生命周期
Activity共有4种状态:
Active:此时activity位于栈顶,可见,并且正在与用户交互
Paused:activity仍然可见,但是不能与用户交互了。比如启动了一个非全屏的activity或者透明的activity。
Stoped:activity不可见,与不能与用户交互了。启动了一个一般的activity
Destroyed:用户点击back或者系统将activity实例销毁。
onCreate:当Activity第一次被创建时调用。是生命周期开始的第一个方法。在这里我们可以做一些初始化的操作,比如:调用setContentView()方法去加载界面,绑定布局里的一些控件,初始化一些Activity需要用到的数据。之后会调用onStart方法
onStart:当Activity正在变为可见时调用。这个时候Activity已经可见了,但是还没有出现在前台还不能跟用户交互。可以简单理解为Actvity已经可见但是还没有出现在前台。之后会调用onResume
onResume:当Activity可以跟用户交互时调用,这个时候,这个Activity位于栈的顶部。跟onStart相比,它们都是表示Activity已经可见,但是onStart调用时Activity还在后台,而调用onResume时,Activity已经进入了前台,可以跟用户交互了。之后会调用 onPause
onPause:当Activity暂停时调用这个方法;在这里我们可以用来保存数据,关闭动画和其它比较耗费CPU的操作;但是在这里做的操作绝对不能耗时,因为如果当前Activity要启动一个新的Activity,这个新的Activity会在当前Activity执行完毕onPause之后才能进入可见状态。这个方法之后一般会调用的方法有onStop或者onResume
onStop:当Activity进入后台,并且不会被用户看到时调用。当别的Activity出现在前台时,或者Activity会被销毁时,调用此方法;在这个方法调用之后,系统可能会在内存不够的情况下回收Activity;在这个方法之后一般会调用onRestart或者onDestroy
onDestroy:这个方法是Activity生命周期中调用的最后一个方法。它会在Activity被销毁之前调用;Activity销毁原因一般是我们调用Activity的finish方法手动销毁,另一个就是系统在内存紧张的情况下去销毁Activity,以用来节省空间。我们可以通过方法 isFinishing 来判断Activity是否正在被销毁。
onRestart:这个方法是在Activity处于停止状态后,又回到可视状态时调用。之后会调用onResume
常见的生命就是以上这些了,一定要注意理解每个生命周期的意思,这些生命周期都是系统帮我们回调回来的,虽然我们没必要对回调过程做太深入的研究(一般情况下不需要),但是一定要理解,生命周期方法代表的意义。
生命周期其实就是android系统在告诉我们activity处于什么样的状态,我们需要在不同的状态下做不同的事情。
(1)back键和home键
back:finish->onPause->onStop->onDestory。也就是说点击了back后,再次进入该activity需要重新onCreate
home:onPause->onStop。此时Activity实例并没有销毁,所以再次进入时走onRestart->onStart->onResume
注意两种方式生命周期的不同
(2)结束:finish和onDestroy
finish,比如用户点击back,会主动回调finish,最终销毁Activity实例
onDestroy,系统回调的生命周期,也会销毁Activity实例
我们看一下finish的源码
/**
* Call this when your activity is done and should be closed. The
* ActivityResult is propagated back to whoever launched you via
* onActivityResult().
*/
public void finish() {
finish(DONT_FINISH_TASK_WITH_ACTIVITY);
}
都是去结束activity,区别就是一个是主动,一个是被动
我们知道,系统会尽可能的保存运行的进程,一旦内存吃紧,就会根据一套规则去清理进程,一旦应用因为内存原因被系统强制回收了,那么再次进入的时候是可以保存之前的状态的,是怎么回事呢?这里引入2个生命周期
(3)保存/恢复,onSaveInstanceState,onRestoreInstanceState
onSaveInstanceState,部分注释如下
/**
* Called to retrieve per-instance state from an activity before being killed
* so that the state can be restored in {@link #onCreate} or
* {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
* will be passed to both).
意思就是说当Activity将要被killed时候调用,以便再次打开该Activity时可以通过Bundle对象恢复数据。
用户主动销毁的Activity不会调用,只有系统未经用户允许的情况下,销毁了Activity,这时候才可能会调用。
onRestoreInstanceState,不做详细研究,保存的时机和作用清楚了,恢复的意思显而易见。
(4)onNewIntent
还是先看定义
* This is called for activities that set launchMode to "singleTop" in
* their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
* flag when calling {@link #startActivity}. In either case, when the
* activity is re-launched while at the top of the activity stack instead
* of a new instance of the activity being started, onNewIntent() will be
* called on the existing instance with the Intent that was used to
* re-launch it.
从字面上理解,一个新的intent。我们知道,启动activity,是需要intent的,onNewIntent其实就是再次启动activity时的回调方法。
注意,这个方法不是再次启动activity就一定会调用。当可以复用activity实例时,会调用。不单是singleTop,其他启动模式只要复用都会调用,默认的启动模式是永远创建新实例,所以永远不会调用
关于启动模式的可以看下一篇 《启动模式》,结论:activity复用,就会调用onNewIntent