? ? ? ?在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設備旋轉前保存數據的方法,如果還有哪些不明白的地方,可隨時來電和我們聯系,本公司專業為您服務!