在之前的开发中一直都在使用Activity但对其的了解也是比较浅显的,为了能开发出高质量的应用,对Activity的深入了解肯定是必不可少的,下面通过这篇文章记录一下对Activity的回顾以及一些新的理解。
上图是谷歌官方文档上对Activity生命周期的介绍,简单的翻译一下(英语很菜/(ㄒoㄒ)/~~)
安卓系统采用一个Activity栈来管理开启的一些Activity,当一个新的Activity被开启时,这个新开启的Activity会被放置在activity栈的顶部成为正在运行的activity,之前的activity就会放置在activity栈的底部,并且也不会来到前台直到新的activity结束掉。
Activity的四种形态:
上面这张图应该比较熟悉吧(●’◡’●)
Activity类定义了7个回调方法,下面记录下各个方法的作用:
onCreate( ):在Activity第一次被创建的时候调用。可以在onCreate方法中完成Activity的初始化操作。
onStart( ):此方法在Activity由不可见变为可见时调用。
onResume( ):此方法在Activity准备好和用户进行交互的时候调用,此时的activity一定处于栈的栈顶,并且处于运行状态
onPause( ):此方法在系统准备启动或者恢复另一个Activity的时候调用。可以在此方法中将一些消耗cpu的资源释放掉,以及保存一些关键的数据,但是这个方法的执行一定要快,不然会影响到新的栈顶Activity的使用。
onStop( ):此方法在Activity完全不可见的时候调用,它和onPause( )方法的区别在于,如果启动的新的Activity是一个对话框的活动,那么onPause( )方法会得到执行,而onStop( )方法不会执行。
onDestroy( ):此方法在Activity销毁之前调用,之后的Activity状态变为销毁状态。
onRestart( ):此方法在Activity由停止状态变为运行状态时调用。
下面通过代码实例演示一下Activity的生命周期的执行流程:
(用于演示的Demo的结构)
a. 启动一个Activity并将其销毁:
生命周期方法执行的流程:
系统在启动一个Activity的时候首先会调用onCreate( )方法,然后就会调用onStart( ),接着继续调用onReasume( )以进入Resumed状态,最后就会停止在Resumed状态,完成启动。
b.开启一个新的activity时生命周期方法执行的流程 :
生命周期方法执行的流程:
由于开启了secondActivity所以FirstActivity处于不可见状态此时执行了onPause( )方法,并且开始创建secondActivity一次执行onCreate()==>onStart() ⇒ onResume()完成secondActivity的创建,然后FirstActivity执行onStop()方法。
c.从当前的Activity跳转到上一个Activity时生命周期方法执行的流程:
生命周期方法执行的流程:
d.点击home键返回主页时生命周期方法执行的流程:
生命周期方法执行的流程:
e.开启一个透明的Activity生命周期方法执行的流程:
此时FirstActivity失去了与用户进行交互的能力,转化为Paused形态。
一般来说,当系统调用onPause()和onStop()方法后的Activity
实例仍然存在与内存当中,当Activity重新回到前台的时候,之前的状态会得到保留,但是当系统内存不足时,调用过onPause()和onStop()方法后的Activity可能会被系统进行回收,此时再重新回到前台,之前的所有状态就会消失,为了避免这种情况的发生可以调用onSaveInstanceState()方法来保存之前的状态。
/**
* 重写此方法进行activity状态的保存
* @param outState
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("name", "wangke");
}
在onCreate( )方法中进行状态的获取:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "FirstActivity==>onCreate()", Toast.LENGTH_SHORT).show();
Log.i("wk", "FirstActivity==>onCreate()");
//恢复之前保存的状态
if(savedInstanceState!=null){
String name = (String) savedInstanceState.getString("name");
if (name != null) {
Log.i("wk", "获取之前保存的状态:" + name);
}
}
}
需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出Activity时, 用户显然想要关闭这个Activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前.
在实际的开发中,我们需要为每个Activity指定恰当的启动模式,以提用户体验。
四种启动模式:
standard(默认的启动模式)
singleTop
singleTask
singleInstance
给Activity配置启动模式:
在AndroidMainifest.xml中给 activity标签中指定如下
android:launchMode="singleTop"
下面通过实例演示一下四种启动模式的区别:
(给FirstActivity设置不同的启动模式,SecondActivity为默认的standard)
1.standard:
与上面示例对应的Activity栈:
standard启动模式每次都会创建新的实例,每次点击都会创建新的Activity覆盖在原Activity。点击back返回的时候按照后进先出进行退栈。
2.singleTop:
与上面示例对应的Activity栈:
如果栈顶的Activity为singleTop模式,如果要打开的Activity为当前栈顶的Activity此时不会重新创建新的,而是直接复用当前处于栈顶的Activity。
注:这种启动模式一般使用于接收到消息后显示的界面,例如QQ接收到消息后弹出Activity。
3.singleTask:
与上面示例对应的Activity栈:
singleTask检测整个Activity栈中是否存在当前需要启动的Activity,如果存在则将该Activity置于栈顶,并将该Activity以上的Activity都销毁。
4.singleInstance:
与上面示例对应的Activity栈:
申明为singleInstance的Activity会出现在一个新的任务栈当中,而且该任务栈中只存在这一个Activiy实例。
这种启动模式常用于需要与程序分离的界面。
除了在Mainifest中配置Activity的启动模式,还可以
通过设置Intent的Flag来设置一个Activity的启动模式。
常用的一些Flag:
Intent.FLAG_ACTIVITY_NEW_TASK: 使用一个新的Task来启动一个Activity,但启动的每一个Activity都将在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于在Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activiy栈,并创建新的Activity实例。
Intent.FLAG_ACTIVITY_SINGLE_TOP: 使用singleTop模式来启动一个Activity。
Intent.FLAG_ACTIVITY_CLEAR_TOP: 使用singleTask模式来启动一个Activity
Intent.FLAG_ACTIVITY_NO_HISTORY: 使用这种模式启动Activity,当该Activity启动其它Activity后,该Activity就消失了,不会保留在Activity栈中。
撒花,撒花★,°:.☆( ̄▽ ̄)/ :∗.°★∗。∗★,°∗:.☆( ̄▽ ̄)/ :.°★ 。一个下午的时间重新梳理了下Activity相关的知识,也算对Activity有了更深一层的认识,当然……部分原因是太无聊……