Activity
Activity状态
Resumed
有时还叫Running状态,此时Activity显示在屏幕上并且有用户焦点。
Paused
另一个有用户焦点透明的或者没有占据全屏幕的Activity覆盖在此Activity上,此时可见。一个Paused状态的Activity依然是活着的(Activity对象依然保留在内存中,维护着所有的状态以及成员信息,依然依附在WindowsManager上),但是在内存极低情况会被系统杀死。
Stopped
已经被另一个Activity完全覆盖,用户不可见。一个Stopped状态的Activity也是活着的(Activity对象依然保留在内存中,维护着所有的状态以及成员信息,已不依附在WindowsManager上),当其他应用需要内存时会被系统杀死。
Android系统通过询问Activity(让Activity自己finish)或者直接杀死进程的方式,从内存移除一个paused或者stopped状态的Activity。如果发生此情况(finished或者killed)后,再回到此Activity时该Activity会被重新创建。
生命周期回调方法
Activity状态变化时,不同的状态会回调不同的方法。可以重写对应的方法应对不同的Activity状态,满足产品需求和业务逻辑。下面的例子包含了基本的生命周期方法:
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
//正在被创建
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
//将要显示
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
//已显示,resumed状态
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
//另一个Activity正在获得焦点,此Activity将变为paused状态
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
//Activity已不可见,stopped状态
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
//Activity将要被销毁
}
}
注意:就像上面例子中一样,重写这些生命周期方法时必须先调用父类的实现方法然后再写其他代码。
Activity生命周期三个嵌套循环
1. 完整的生命周期:
从onCreate()后到onDestroy()被调用前(between the call to onCreate() and the call to onDestroy())。在onCreate()初始化,在onDestroy()释放持有的所有资源。例如在onCreate()中创建一个下载线程,在onDestroy()停止此线程。
2. 可见生命周期:
从onStart()后到onStop()被调用前(between the call to onStart() and the call to onStop())。在此期间用户可见并且可以与其交互。当开启一个新的Activity并且此Activity不可见时onStop()会被调用。在这两个方法之间,你可以保持Activity需要展示的资源。例如你可以在onStart()注册一个BroadcastReceiver监视那些可以更改UI的变化,在onStop()时注销掉。
3. 前台生命周期:
从onResume()后到onPause()被调用前(between the call to onResume() and the call to onPause())。在此期间Activity在屏幕的最前面并拥有用户输入焦点。Activity经常从前台切入切出。例如当熄屏或者弹出一个对话框时onPause()会被调用。由于这种状态转换比较频繁,为了不影响用户体验,所以在这个两个方法中不要做比较耗时的操作。
生命周期方法摘要
方法 | 描述 | 调用后进程能否被杀死 | 下一个方法 |
Activity第一次创建时被调用。在此方法中通常会做创建View、初始化数据等操作。如果是重建的Activity,会传进入一个里包含了之前Activity对象保存状态的Bundle对象。下一个方法通常是onStart()。 | 不能 | ||
当Activity被stop后重新回来时会调用。一个方法通常是onStart()。 | 不能 | ||
Activity可见之前被调用。Activity变为可见下一个方法就是onResume(),如果变为不可见则是onStop()。 | 不能 | ||
在与开始与用户交互之前被调用。此时Activity在Activity栈的最顶部。下一个方法通常是onPause()。 | 不能 | ||
当系统将要使另一个Activity可见时调用。这个方法通常的用法是提交未保存的数据、停止动画、停掉那些可能消耗CPU的操作等。不能做太耗时的操作,此方法不结束另一个Activity不能显示。如果用户返回到前台则下一个方法是onResume(),如果变得不可见则是onStop()。 | 能 | ||
当Activity不可见时被调用。Activity被销毁或者另一个Activity将此Activity覆盖会被调用。如果返回到前台下一个方法是onRestart(),如果是销毁则是onDestroy()。 | 能 | ||
被销毁时调用。此方法是Activity生命周期中的最后一个方法。当Activity自己调用finish()或者系统为了节省空间将其暂时销毁掉时会调用此方法。可以使用isFinishing()区分这两种情况。 | 能 | 没有 |
onPause()、 onStop()、 onDestroy()被调后系统可以杀死宿主进程。onPause()是可以将其宿主进程杀死的第一个方法,Activity被创建后能保证被调用的最后一个方法;在系统必须回收内存的紧急情况下,onStop() 和onDestroy()可能不会被调用。因此一些关键性数据需要在onPause()中保存。当然你需要根据产品需求有选择的保存数据,不能做太耗时的操作。在表“调用后进程能否被杀死”列中标为“不能”的,在这期间其宿主进程不能被杀死。注意:在极端情况下还是可以被杀死的,这只是说了一般情况。
保存数据
在某些情况下(如回收内存),系统可能会杀死Activity。当Activity在回到前台时,系统需要重新创建Activity。为了更好的用户体验,为了让用户没有感知Activity被杀死过,所以必须保存一些数据以来恢复Activity。可以使用系统传给onSaveInstanceState()的Bundle对象保存一些为了恢复Activity的重要信息。当Activity的宿主进程被杀死后,又返回到该Activity时,系统需要重新创建一个新的Activity。创建新的Activity时,系统会将该Bundle对象传递给onCreate()和onRestoreInstanceState()方法,便可以从中取出重要的信息恢复Activity。如果没有保存数据,将不能得到Bundle对象(例如Activity被第一次创建时)。
恢复Activity有两种情况,一种是destroyed状态,一种是从stopped的状态。
注意:onSaveInstanceState()并不一定被调用,例如点击返回键时明确销毁Activity,此时不调用。系统会在调用onStop() 之前调用onSaveInstanceState(),onSaveInstanceState()与onPause()调用顺序不定。
由于Activity有onSaveInstanceState()的默认实现,即使不重写onSaveInstanceState()也能够保存一些数据。默认实现会调用View的onSaveInstanceState()方法,让View保存自己的数据。Android提供的View都实现了的onSaveInstanceState()方法。例如EditText会保存输入内容,CheckBox会保存是否选中状态。我们唯一需要做的就是给这些View提供一个ID(android:id),如果不提供ID系统无法保存View的状态(信息)。可以使用android:saveEnabled或者setSaveEnabled()设置是否保存View状态。
尽管Activity的onSaveInstanceState()默认实现可以保存UI的有用信息,但是为了保存一些额外的信息仍需要重写此方法。如果重写此方法请先调用父类方法,onRestoreInstanceState()也是一样,这样便可以恢复View状态。
注意:由于onSaveInstanceState()不能保证被调用,你只能用它保存UI状态不能用它保存数据。当用户离开Activity时,请使用onPause()存储持续化数据(如将数据保存在数据库中)。
为了测试存储状态能力,你可以旋转屏幕来测试。当屏幕旋转时,系统会将老Activity销毁然后重建一个新的Activity。
处理配置变化
在运行时有些设备配置可以变化(屏幕方向、键盘、语言)。当配置发生变化时,Android系统会立即重建当前运行的Activity(调用onDestroy(),然后立即调用onCreate())。自动重新加载可替换资源适配新的配置,例如横竖屏加载不通布局文件。
打开新Activity的流程
1.调用ActivityA的onPause()
2.顺序调用ActivityB的onCreate()、onStart()、onResume()
3.当ActivityA不再显示时,调用ActivityA的onStop()