参考:android官方文档
图中详细给出了Activity整个生命周期的过程,以及在不同的状态期间相应的回调方法。
一个简单完整的生命周期会顺序调用以下方法onCreate()->onStart()->onResume()->onPause()->onDestory()。每个方法的调用都会进入到对应的状态。
虽然activity具有多种状态(图中显示了7中状态),但是只有三种状态可以长时间存在:
Resumed(运行):当activity位于前台时(即用户当前可见的activity),用户可以与它进行交互。
Paused(暂停):在这种状态下,activity被另一个activity所掩盖,在前台的另一个activity是半透明的或不覆盖整个屏幕。被覆盖的activity将不能接受用户的输入,不能执行任何代码。
Stopped(停止):在这种状态下,activity是完全隐藏的对用户是不可见,虽然停止,活动实例和所有它的状态信息,如成员变量被保留,但它不能执行任何代码。
其他状态(created和started)是短暂的,系统通过调用下一个生命周期回调方法快速地从它们移动到下一个状态。在系统调用onCreate()后,很快调用onStart(),这之后紧接着的是onResume()。
创建一个新的实例
系统通过调用Activity的onCreate()方法创建每一个新的activity实例。必须实现onCreate()方法进行基本的应用程序启动的逻辑(如声明用户界面(在XML布局文件中定义),定义成员变量,并配置一些用户界面。),在activity的整个生命周期内应该只发生一次。
TextView mTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
mTextView = (TextView) findViewById(R.id.text_message);
}
一旦oncreate()执行完成,系统会快速调用onStart()和onResume()方法。执行完成之后,此时activity处于Resumed状态,可以与用户进行交互直到切换到一个不同的activity。
暂停一个Activity
在正常应用程序使用过程中,前台活动有时会被其他视觉组件所阻碍导致activity暂停。例如,当一个半透明的活动打开(如一个对话框)。activity仍然是部分可见的,但目前不是焦点,处于Paused状态。
当activity进入暂停状态,系统调用activity的onPause()方法,如果用户从暂停状态返回,系统恢复activity并调用onResume()方法。
通常在以下情况下需要使用onPause方法:
停止动画或持续消耗cpu的活动(视频)
释放系统资源,如广播接收器,处理传感器(如全球定位系统),或当activity暂停后用户不在需要但可能会影响电池寿命的任何资源。
需要自动保存的信息(如电子邮件草稿)。
如果应用程序使用Camera,onpause()方法是释放它的好地方。
private Camera mCamera;
@Override
protected void onPause() {
super.onPause();//总是先调用父类的方法
//释放相机,因为在暂停时我们不需要它并且其他activities可能需要使用它
if (mCamera!=null)
{
mCamera.release();
mCamera=null;
}
}
一般来说,不应该使用onPause()存储用户的变化(如个人信息输入到表格)。只有需要自动保存的情况下,才需要在onPause()方法中存储用户的变化(如电子邮件草稿)。应该避免在onPause()执行极消耗CPU的工作,比如写一个数据库,因为这会延迟下一个可见activity的启动。
注意:当您的活动被暂停时,活动实例将驻留在内存中,并在活动恢复时被召回。
恢复Activity
当用户将activity从暂停状态恢复时系统将调用onResume()方法。
在onResume()方法中需要恢复在onPause()方法中停止的动画或释放的组件(将我们需要使用但停止或释放了的资源进行恢复)。
@Override
protected void onResume() {
super.onResume();
if (mCamera==null)
{
initializeCamera();//初始化Camera
}
}
停止Activity
暂停activity是经常发生的一种状态,如跳转到一个新的activity,来电,用户主动将app放置到后台重启另一个app等都将触发暂停状态。
在activity变为Stopped状态之前会先经历Paused状态,即系统会依次调用onPause()方法和onStop()方法。因此很多时候不需要实现onStop()方法。但是如果涉及到消耗cpu的操作时,仍需实现onStop()方法,如向数据库中写数据。
开始/重新开始Activity
当activity从Stoped状态重新显示时,系统先调用onRestart()方法,之后调用onStart()方法。其中onStart()方法在第一次创建时也会被调用,而onRestart()方法只有activity从Stoped状态中恢复时才调用,因此可以在onRestart()执行特殊的恢复工作(没用过),在onRestart()中去恢复activity的状态是很少见的。
onStart()方法与onStop()方法是相对的,即在onStop()中清理了资源,就需要在onStart()中恢复资源。
销毁Activity
当系统销毁一个activity时,会调用activity的onDestory()方法。通常情况下,在onStop()方法中应该要释放绝大部分资源,因此在onDestory()方法中不会有太多的操作。onDestory()方法是最后的机会去清除可能导致内存泄漏的资源。需要确保额外的线程被销毁,并停止其他长时间运行的操作。
重新创建Activity
当用户按下返回键或者activity调用finish()方法都会导致activity被正常销毁。如果因为一些原因导致activity非正常销毁时,虽然该activity已经不存在了,但是当用户返回到该activity时,系统扔可以根据销毁时保存的一系列状态信息创建一个该activity新的实例。例如:当Activity A跳转到Activity B时,如果内存不足,A被回收,但当用户按下Back键返回时,A又会被系统重新创建。
为了存储activity状态数据,必须重写onSaveInstanceState()方法。当activity意外被销毁时,系统会调用该方法传递保存的Bundle对象。如果之后系统重新创建该activity实例,系统会将相同的Bundle对象传递给onCreate()方法和onRestoreInstanceStart()方法。因此在onCreate()方法和onRestoreInstanceStart()方法中都可以进行恢复操作,只需二选一即可。
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// Always call the superclass first
super.onCreate(savedInstanceState);
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}