Android Activity如何保存和恢复Object

Android Activity中提供了onSaveInstanceState()和onRestoreInstanceState()的方法,对简单的数据类型进行存储和恢复。

如果需要保存一些复杂的Object,例如socket、自定义类等等,可以用两种方法做到:

1. 使用Activity中的函数onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()。 下面是这两个函数的使用范例:
=====================================================================
public class MainActivity extends Activity {
   
   MyObject m;
   
   @Override
   protected void onCreate(Bundle savedInstanceState{
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       if(getLastNonConfigurationInstance() != null)
           m = (MyObject)getLastNonConfigurationInstance();
       else
           m = new MyObject();
       TextView a = (TextView)findViewById(R.id.textView1);
       a.setText(m.a.get(0));
   }

   @Override
   @Deprecated
   public Object onRetainNonConfigurationInstance() {
       return m;
   }

   public void onclickbutton(View v{
       m.a.set(0, "s");
   }
   
}
=====================================================================

但是,onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()在API13之后已经不推荐使用了。官方推荐使用的是Fragment的setRetainInstance(true)。为什么要用这个方法、以及怎么使用这个方法,可以参考:

2. 使用Gson将你的Object转换成String。
Gson是一个用于将java对象转换为json格式的java工具库. 它也可以将json格式的字符串转换为等价的 java 对象. Gson适用于任何java 对象, 包括那些已经存在的, 没有源代码的java对象。 保存你的Object的思路,即为先将你的Object转换成String,并在onSaveInstanceState()中通过Bundle.putString()的方法存储;再恢复你的Activity的时候,我们在onRestoreInstanceState()中通过Bundle.getString()的方法,得到你存储的String,再通过Gson转换成你的Object实例。

以下是示例代码:
=====================================================================
MyObject m;    

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState{
   super.onRestoreInstanceState(savedInstanceState);
   Gson g = new Gson();
   m = g.fromJson(savedInstanceState.getString("MyObject"), MyObject.class);
}

@Override
protected void onSaveInstanceState(Bundle outState{
   super.onSaveInstanceState(outState);
   Gson g = new Gson();
   String mm = g.toJson(m);
   outState.putString("MyObject", mm);
}
=====================================================================

请记住onRestoreInstanceState(Bundle savedInstanceState)是在Activity的onStart()方法执行之后调用。onSaveInstanceState(Bundle outState)是在onPause()方法执行之前调用。

当然,如果你的Activity在onDestroy()前调用了finish(),那么以上两种方法都无法保存和恢复你的对象。那么你的Object就需要通过文件、或者SharedPreference等方法保存了。

附:
onDestroy()前调用finish()方法的行为:onBackPressed() (按下退出键)、 通过settings或任务管理器关闭activity
onDestroy()前调用finish()方法的行为:Activity转换orientation(此时只是重新create该Activity,不调用finishi())
分享到:
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值