转自: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调用的。可以通过
- Object obj = getLastNonConfigurationInstance();
或者cast来转换对象如下例所示:
- String str = (String) getLastNonConfigurationInstance();
好了最后不多说了放一个例子,具体就是读log,在模拟器上检验这个代码的时候,按ctrl+F11切换屏幕方向,就可以看到结果了。
- package com.leewind.onretainnonconfigurationinstance;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- public class TestOnRetainNonConfigurationInstance extends Activity {
- /** Called when the activity is first created. */
- private static final String TAG = "Michael";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- if (getLastNonConfigurationInstance()!=null) {
- String str = (String) getLastNonConfigurationInstance();
- Log.i(TAG, str);
- }
- }
- @Override
- public Object onRetainNonConfigurationInstance() {
- // TODO Auto-generated method stub
- //return super.onRetainNonConfigurationInstance();
- return "Michael";
- }
- }
你会发现一个很有意思的现象,横屏转竖屏的时候会打两行log,这是说要启动Activity 2次吗?