Android 设备旋转前如何保存数据?

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

提供全面的搜索引擎优化学习交流,专注网站优化和搜索引擎营销推广服务。用专业的SEO技术为企业网站提升关键词排名,让你的网站不仅满足用户体验还要适合搜索引擎优化规则。
易速网站优化公司 » Android 设备旋转前如何保存数据?
享更多特权,立即登录下载海量资源
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡