Activity的生命周期有7种回调方法.
1、onCreat() 2、onStart() 3、onResume() 4、onPause() 5、onStop() 6、onDestroy() 7、onRestart()
活动创建时调用onCreat() onStart() onResume()三个方法
按back键返回时,活动销毁,调 onPause() onStop() onDestroy() 三个方法
按home键,活动停止,但并没有销毁,调用 onPause() onStop()两个方法,再次点击应用进来会调用onRestart() onStart() onResume()三个方法,但是当活动在停止状态时,有可能因为系统内存不足而回收掉停止状态下的活动,一旦活动被回收,再次点击应用进来的时候就不会再调用onRestart(),直接调用onCreat() onStart() onResume(),活动被回收掉的时候已经被销毁,所以会调用onCreat()新创建这个活动,这里还有一个问题,当活动被回收前,如果你在EditText中写了一串字符串,那么活动再次创建时文本就会丢失,这严重影响用户体验,那么我们就会想如果能在活动被回收前保存这些数据就好了,这些谷歌大神其实已经都想好了,Activity中还提供了一个 onSaveInstanceState()回调方法,这 个方法会保证一定在活动被回收之前调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。 onSaveInstanceState()方法会携带一个 Bundle类型的参数,Bundle提供了一系列的方法 用于保存数据,比如可以使用 putString()方法保存字符串,使用 putInt()方法保存整型数据, 以此类推。每个保存方法需要传入两个参数,第一个参数是键,用于后面从 Bundle中取值, 第二个参数是真正要保存的内容。 在 MainActivity中添加如下代码就可以将临时数据进行保存:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData); }
数据是已经保存下来了,那么我们应该在哪里进行恢复呢?细心的你也许早就发现,我 们一直使用的 onCreate()方法其实也有一个 Bundle类型的参数。这个参数在一般情况下都是 null,但是当活动被系统回收之前有通过 onSaveInstanceState()方法来保存数据的话,这个参 数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。 修改 MainActivity的 onCreate()方法,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData); }
…… }
取出值之后再做相应的恢复操作就可以了,比如说将文本内容重新赋值到文本输入框 上,这里我们只是简单地打印一下。
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。