Bundle savedInstanceState(Activity被系统干掉前,保存调用)

来源:互联网 发布:c语言保留字 编辑:程序博客网 时间:2024/06/03 21:38

经常会出现用户按到home键,退出了界面,或者安卓系统意外回收了应用的进程,这种情况下,使用Bundle savedInstanceState就可以用户再次打开应用的时候恢复的原来的状态。


看一段代码:

[java] view plain copy print?
  1. package com.example.test.com;  
  2.   
  3.   
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.Window;  
  8.   
  9. public class MainActivity extends Activity {  
  10.   
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.           
  15.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  16.         setContentView(R.layout.main);  
  17.           
  18.         //状态 判断  
  19.         if (savedInstanceState != null) {  
  20.             Log.d("HELLO""HELLO:应用进程被回收后,状态恢复");  
  21.             String string = savedInstanceState.getString("username");  
  22.             if (string != null) {  
  23.                 Log.d("HELLO""HELLO:" + string);  
  24.             }  
  25.         }  
  26.   
  27.     }  
  28.   
  29.     /** 
  30.      * 当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行, 
  31.      * 除非该activity是被用户主动销毁的,例如当用户按BACK键的时候 
  32.      * 一个原则:即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用 
  33.      * 情景: 
  34.      * 1. 当用户按下HOME键时 
  35.      * 2. 长按HOME键,选择运行其他的程序时。 
  36.      * 3. 按下电源按键(关闭屏幕显示)时。 
  37.      * 4. 从activity A中启动一个新的activity时。 
  38.      * 5. 屏幕方向切换时,例如从竖屏切换到横屏时。 
  39.      * 以上情景触发该函数,并且开发者可以保存一些数据状态 
  40.      */  
  41.     @Override     
  42.     public void onSaveInstanceState(Bundle savedInstanceState) {     
  43.       Log.d("HELLO""HELLO:当Activity被销毁的时候,不是用户主动按back销毁,例如按了home键");  
  44.       super.onSaveInstanceState(savedInstanceState);    
  45.       savedInstanceState.putString("username""initphp"); //这里保存一个用户名  
  46.     }     
  47.     
  48.     /** 
  49.      * onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的, 
  50.      * onRestoreInstanceState被调用的前提是, 
  51.      * activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下, 
  52.      * 则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面, 
  53.      * 然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁, 
  54.      * 故activity A的onRestoreInstanceState方法不会被执行 
  55.      */  
  56.     @Override     
  57.     public void onRestoreInstanceState(Bundle savedInstanceState) {     
  58.       super.onRestoreInstanceState(savedInstanceState);   
  59.       Log.d("HELLO""HELLO:如果应用进程被系统咔嚓,则再次打开应用的时候会进入");  
  60.     }     
  61. }  

我们的具体操作:

首先打开这个app应用

其次,按home键,例如意外中止,则会调用onSaveInstanceState方法。可以看到以下日志:


这个时候,如果直接去打开这个应用,可能系统并没有回收这个进程所在的资源,并不能体现出状态恢复的实验,我们可以通过DDMS中,中止这个APP的进程:

中止进程后,再打开应用进入,看看是否有日志:

可以看到上面 initphp这个username也获取到了,说明恢复了状态。恭喜,实验成功。

0 0
原创粉丝点击