Android Activity如何保存和恢复Object

转载 2015年11月19日 15:32:52
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())
分享到:

Activity : 状态保存与恢复

当系统内存不足时,系统会强制结束一些不可见的Activity以节省内存资源。在某些情况下,当被强制结束的Activity再次显示时会出现一些问题。 例如:一个APP有2个Activity界面:Acti...
  • timejay
  • timejay
  • 2016年10月17日 13:54
  • 3014

[译]Android Activity 和 Fragment 状态保存与恢复的最佳实践

译者亦枫注:对于 Activity、Fragment 和 View 是如何保存与恢复状态的问题,相信很多开发人员都处于一知半解的状态。最近刚好在总结 Fragment 的使用注意事项,无意中从网上看到...
  • wenbitianxiafeng
  • wenbitianxiafeng
  • 2016年12月20日 09:50
  • 1543

保存/恢复Activity和Fragment状态的最佳实践(译)

几个月以前,我发布了一篇关于Fragment状态保存和恢复的文章,那可能是目前为止最好的方式用于保存/恢复 Android Fragment 的状态。我收到了很多来自世界各地的Android开发者有价...
  • u011694328
  • u011694328
  • 2016年09月19日 17:42
  • 808

Android中Activity执行restart过程中涉及到的四种数据存储恢复的方法(转)

转自:http://www.2cto.com/kf/201511/449241.html 我们知道,当Configuration Change发生的时候(比如横竖屏切换等),会导致Activity重...
  • zjf1165
  • zjf1165
  • 2016年08月12日 15:52
  • 851

异常情况下Activity数据的保存和恢复

异常情况下Activity数据的保存和恢复 如何保存和恢复数据 如何防止Activity重建 异常情况下Activity数据的保存和恢复如何保存和恢复数据正常情况下Activity的生命周期比较简单,...
  • huaheshangxo
  • huaheshangxo
  • 2016年03月08日 19:18
  • 1872

android重新创建Activity时状态的保存和恢复

在有些情况下,您的Activity会因正常应用行为而销毁,比如当用户按 返回按钮或您的Activity通过调用 finish()示意自己的销毁。 如果Activity当前被停止或长期未使用,或者前...
  • qq_33275597
  • qq_33275597
  • 2016年10月10日 14:16
  • 1093

Android 恢复Activity现场

首先说两个Activity的函数:onSaveInstanceState和onRestoreInstanceState。 经过测试函数onSaveInstanceState并不是像文档里说的,是在内存...
  • csf993981061
  • csf993981061
  • 2016年04月08日 17:36
  • 1603

Activity界面状态保存和恢复

Activity界面状态保存和恢复
  • js331455217
  • js331455217
  • 2014年11月08日 22:41
  • 1921

Android开发之保存和恢复Activity的状态与数据

今天面试的时候面试官问我当按home键的时候 再次进入的时候怎么保存activity的数据和状态 ,瞬间现场蒙逼 ,回来马上做笔记。。。...
  • itluochen
  • itluochen
  • 2016年08月08日 20:46
  • 1409

Android中保存Activity的状态

1.onSaveInstanceState和onRestoreInstanceState基本作用    onSaveInstanceState是用来保存UI状态的,你可以使用它保存你所想保存的东西,...
  • mrleeapple
  • mrleeapple
  • 2015年12月18日 15:01
  • 1242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Activity如何保存和恢复Object
举报原因:
原因补充:

(最多只允许输入30个字)