編輯:關於Android編程
在Fragment裡面,利用onSaveInstanceState保存數據,並可在onActivityCreated裡面恢復數據。
public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInstanceState != null) { // Restore the fragment's state here } } public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Save the fragment's state here }
在Activity裡面,利用onSaveInstanceState保存Fragment實例的數據,並可在onCreate裡面恢復數據:
private Fragment myFragment; public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState == null) { // Instantiate fragment } else { // Restore the fragment's instance myFragment = getSupportFragmentManager().getFragment( savedInstanceState, "fragment"); } ... } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //Save the fragment's instance // fragment instance may be null if (myFragment != null) { getSupportFragmentManager().putFragment(outState, "fragment", myFragment); } }
實例
首先看一個步驟,如果是人為關閉Activity或者Fragment, 比如點擊了後退鍵,主動關閉當前頁面,就會走 onPause() --> onStop() --> onDestroy() 而onSaveInstanceState() 並不會被調用. onSaveInstanceState() 只有在系統即將要自動清理銷毀Activity或Fragment前才會調用, 比如
1, 由於重力感應 手機從豎屏變為橫屏,
2, 手機點擊Home鍵和長按Home鍵
3, 點擊電源鍵鎖屏時
4, 從當前Activity跳到另一個Activity
5, 應用內存不足即將自動銷毀時等情況
綜合上面的情況,可以看出, onSaveInstanceState() 這個方法適合臨時保存一些非永久性的數據.如果要持久化保存數據,就要將操作放在onStop(), onDestroy()這些方法中去.onSaveInstanceState() 適合的是當前Activity或者Fragment一旦被系統自己銷毀,應用還能在這之前保存一些必要的數據, 並且用戶的操作很快又回到當前這個頁面,這個時候數據並沒有丟失,還能最大程度的恢復之前狀態.這就是這個方法最大的意義.下面上例子做個簡單示例:
在Fragment中:
//系統自動銷毀Fragment前保存必要的數據 @Override public void onSaveInstanceState(Bundle outState){ <span > </span>super.onSaveInstanceState(outState); <span > </span>String content = etCon.getText().toString(); <span > </span>outState.putString("inputCon", content); } //恢復數據 @Override public void onViewStateRestored(Bundle savedInstanceState){ <span > </span>super.onViewStateRestored(savedInstanceState); <span > </span>//恢復之前輸入框的內容 <span > </span>if(savedInstanceState != null){ <span > </span>etCon.setText(savedInstanceState.getString("inputCon", "")); } }
在Activity中
//系統自動銷毀Activity前保存必要的數據 @Override public void onSaveInstanceState(Bundle outState){ <span > </span>super.onSaveInstanceState(outState); String content = etCon.getText().toString(); outState.putString("inputCon", content); } //Activity中可在onRestoreInstanceState()方法恢復數據,也可以在onCreate()中恢復,因為Activity一旦被銷毀就會重走一次onCreate()開始的正常生命周期 @Override public void onRestoreInstanceState(Bundle savedInstanceState){ super.onRestoreInstanceState(savedInstanceState); //恢復之前輸入框的內容 if(savedInstanceState != null){ etCon.setText(savedInstanceState.getString("inputCon", "")); } } @Override public void onDestroy(){ super.onDestroy(); //Activity被銷毀前可進行最後一次數據的保存,過了這村就沒這店了. }
這裡有個重要的點,上面的上面所提及的onSaveInstanceState()方法只有在Activity或Fragment確定要被系統自動清除時,才會被調用,如果不是長期後台應用,頁面沒有被系統kill掉,對應的Activity或Fragment也就不會調用onSaveInstanceState()這些方法.
之前一章記錄了跨應用啟動service,之前學習過startService於bindService的區別及用法。使用bindService方法,activity需要ser
以前編程的時候,遇到倒計時的功能時,經常自己去寫,但其實Android已經幫封裝好了一個倒計時類CountDownTimer,其實是將後台線程的創建和Handler隊列封
先看一看我的代碼運行結果。代碼運行起來初始化狀態: 點擊開始按鈕,唱片機的機械臂勻速接近唱片磁盤,同時唱片磁盤也開始勻速順時針旋轉: &n
一般來說 真機調試 是最快的, 所以建議 大家 直接用真機調試。