[Android][Activity] onRetainNonConfigurationInstance的调用探讨

转自:http://blog.csdn.net/leewind841209/article/details/6569324

[Target]

在上面一篇文章里面讲了怎么用onSaveInstanceState,也分析了onSaveInstanceState的局限性和问题,这篇文章就讲讲怎么用onRetainNonConfigurationInstance突破这种局限

 

[Investigation]

上篇文章讲到onSaveInstanceState调用的返回值只出现在onCreate和onRestoreInstanceState两个地方,且必须以Bundle的形式存储信息。在代码上面有很多的局限性。所以Google还提供了一个API:onRetainNonConfigurationInstance.

当Device的Configuration发生改变时,这个改变包括了屏幕的方向的变化、keyboard的弹出等,当发生改变时Activity会调用到onDestroy,这个时候可以通过onRetainNonConfigurationInstance来保存数据。

 

onRetainNonConfigurationInstance的使用

onRetainNonConfigurationInstance的返回值是一个object,所以在这里可以把integer, string这些对象和一些自定义对象,返回出去,不用再受到bundle的局限。

onRetainNonConfigurationInstance的返回值是通过getLastNonConfigurationInstance调用的。可以通过

 

[java]  view plain copy
 
  1. Object obj = getLastNonConfigurationInstance();  

或者cast来转换对象如下例所示:

 

[java]  view plain copy
 
  1. String str = (String) getLastNonConfigurationInstance();  

 

好了最后不多说了放一个例子,具体就是读log,在模拟器上检验这个代码的时候,按ctrl+F11切换屏幕方向,就可以看到结果了。

 

[java]  view plain copy
 
  1. package com.leewind.onretainnonconfigurationinstance;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.util.Log;  
  5. public class TestOnRetainNonConfigurationInstance extends Activity {  
  6.     /** Called when the activity is first created. */  
  7.     private static final String TAG = "Michael";  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);  
  12.         if (getLastNonConfigurationInstance()!=null) {  
  13.             String str = (String) getLastNonConfigurationInstance();  
  14.             Log.i(TAG, str);  
  15.         }  
  16.           
  17.     }  
  18.     @Override  
  19.     public Object onRetainNonConfigurationInstance() {  
  20.         // TODO Auto-generated method stub  
  21.         //return super.onRetainNonConfigurationInstance();  
  22.         return "Michael";  
  23.     }  
  24.       
  25. }  

你会发现一个很有意思的现象,横屏转竖屏的时候会打两行log,这是说要启动Activity 2次吗?

猜你喜欢

转载自892848153.iteye.com/blog/2061862