十三年专注于网站建设与互联网应用开发,低调、有情怀的网络应用服务商!
南昌百恒科技微信公众号 扫一扫关注
tel-icon全国服务热线:400-680-9298,0791-88117053
扫一扫关注百恒科技微信公众号

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

百恒 2017-06-26 17:03:26 3199
       在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设备旋转前保存数据的方法,如果还有哪些不明白的地方,可随时来电和我们联系,本公司专业为您服务!
400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号

欢迎您的光顾,我们将竭诚为您服务×

售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售后服务 售后服务
 
备案专线 备案专线
 
售后服务 售后服务
 
×