百恒网络
Android 设备旋转前如何保存数据?
  • 百恒服务
  • APP开发
  • 网页案例
  • 网页知识
  • 关于我们
  • 联系我们
  • Android 设备旋转前如何保存数据?

    2017-06-26 17:03:26 3422
           在android 开发中适时使用备选资源虽然是Android提供的较完美的解决方案,但是,设备旋转导致的activity销毁与新建也会带来麻烦。比如,设备旋转后,GeoQuiz应用回到第一道题目的缺陷。
           要修正这个缺陷,旋转后新创建的QuizActivity需要知道mCurrentIndex变量的原有值。因此,在设备运行中发生配置变更时,如设备旋转,需采用某种方式保存以前的数据。下面南昌APP开发专家就来为大家介绍一下其中的方法。
           覆盖以下Activity方法就是一种实现方式:
           protected void onSaveInstanceState(Bundle outState)
           该方法通常在onPause()、onStop()以及onDestroy()方法之前由系统调用。
           方法onSaveInstanceState(...)的默认实现要求所有activity视图将自身状态数据保存在Bundle对象中。Bundle是存储字符串键与限定类型值之间映射关系(键值对)的一种结构。
           之前已使用过Bundle,如下列代码所示,它作为参数传入onCreate(Bundle)方法:
           @Override
           public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           ...
           }
           覆盖onCreate(...)方法时,我们实际是在调用activity超类的onCreate(...)方法,并传入收到的bundle。在超类代码实现里,通过取出保存的视图状态数据,activity的视图层级结构得以重新创建。
           覆盖onSaveInstanceState(Bundle)方法
           可通过覆盖onSaveInstanceState(...)方法,将一些数据保存在bundle中,然后在onCreate(...)方法中取回这些数据。处理设备旋转问题时,将采用这种方式保存mCurrent-Index变量值。
           首先,打开QuizActivity.java文件,新增一个常量作为将要存储在bundle中的键值对的键,代码如下所示:
           新增键值对的键(QuizActivity.java)
           public class QuizActivity extends AppCompatActivity {
           private static final String TAG = "QuizActivity";
           private static final String KEY_INDEX = "index";
           private Button mTrueButton;
           ...
           然后,覆盖onSaveInstanceState(...)方法,以刚才新增的常量值作为键,将mCurrentIndex变量值保存到bundle中,如下代码所示。
           覆盖onSaveInstanceState(...)方法(QuizActivity.java)
           mNextButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
           mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
           updateQuestion();
           }
           });
           updateQuestion();
           }
           @Override
           public void onSaveInstanceState(Bundle savedInstanceState) {
           super.onSaveInstanceState(savedInstanceState);
           Log.i(TAG, "onSaveInstanceState");
           savedInstanceState.putInt(KEY_INDEX, mCurrentIndex);
           }
           最后,在onCreate(...)方法中确认是否成功获取该数值。如获取成功,则将它赋值给变量
           mCurrentIndex,如下代码所示。
           在onCreate(...)方法中检查存储的bundle信息(QuizActivity.java)
           ...
           if (savedInstanceState != null) {
           mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
           }
           updateQuestion();
           }
           运行GeoQuiz应用,单击NEXT按钮。现在,无论设备自动或手动旋转多少次,新创建的QuizActivity都会记住当前正在回答的题目。
           注意,在Bundle中存储和恢复的数据类型只能是基本数据类型(primitive type)以及可以实现Serializable或Parcelable接口的对象。在Bundle中保存定制类对象不是个好主意,因为你取回的对象可能已经过时了。比较好的做法是,通过其他方式保存定制类对象,而在Bundle中保存对象对应的基本数据类型的标示符。
           测试onSaveInstanceState(...)实现方法是个好习惯,尤其在需要存储和恢复对象时。设备旋转很容易测试,但测试低内存状态就困难多了。
           以上就是南昌APP开发中APP设备旋转前保存数据的方法,如果还有哪些不明白的地方,可随时来电和我们联系,本公司专业为您服务!
    展开分享
    服务
    案例
    首页
    动态
    联系
    咨询