在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设备旋转前保存数据的方法,如果还有哪些不明白的地方,可随时来电和我们联系,本公司专业为您服务!
易速网站优化公司 » Android 设备旋转前如何保存数据?