假設我有兩個活動,activity1和activity2。 我想從activity1導航到activity2,從activity2獲取一些信息並將其插回到activity1,同時我也不想在離開時丟失activity1之前的狀態。 我該如何保存它的狀態?使用onResume和onPause
回答
覆蓋onSaveInstanceState(Bundle)
在activity1
保存任何您想要的數據,然後在同一活動中覆蓋onRestoreInstanceState(Bundle)
以獲取值。使用Bundle
,你可以存儲你想要的任何數據。我推薦這樣的:
public class MainActivity extends Activity {
...
public static final String DATA1_KEY = "data1";
private boolean value1;
...
@Override
protected void onSaveInstanceState (Bundle outState) {
outState.putBoolean(DATA1_KEY, value1);
}
@Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
value1 = savedInstanceState.getBoolean(DATA1_KEY);
}
}
如果你想保持你的數據只在運行時保持活動狀態,考慮使用靜態成員。然後,您可以從任何活動中訪問和操作這些成員。例如:
public class FirstActivity extends Activity
{
public static String data = null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
data = "This is a test!";
}
}
從你的第二個活動,你可以訪問諸如
public class SecondActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(...);
if(FirstActivity.data!=null)
{
//You can use it:
System.out.println(FirstActivity.data);
}
}
}
當然你也可以添加getter/setter函數,使之更安全,更優雅的這些靜態變量。
如果你想將它們存儲時間較長,則請考慮使用:
- SharedPreferences
- SQLite
- 或您的數據存儲在一個在線數據庫。
您所描述的是使用Activity.startActivityForResult()
方法的完美經典理由。
這是谷歌這種方法文檔中寫道:
啓動爲您希望的結果,當它完成了一個活動。當這個Activity退出,您的onActivityResult()方法將被給定requestCode
所以你應該做的是呼籲:從結果的活動1開始活動,並從活性2使用setResult(int resultCode, Intent data)
方法你想要的數據你的活動1回來,並致電finish()
(它會回到onActivityResult()
在同一國家activity1以前..)。
用戶在您的應用中執行一項操作,開始一項新活動。當第二個活動創建時,當前活動停止。如果用戶然後按下「後退」按鈕,則第一個活動將重新啓動。
當您的活動停止時,活動對象將保持駐留在內存中,並在活動恢復時被調用。您不需要重新初始化任何導致恢復狀態的回調方法期間創建的組件。系統還會跟蹤佈局中每個視圖的當前狀態,因此,如果用戶將文本輸入到EditText小部件中,則會保留該內容,因此您無需保存和恢復它。
注意:即使當它停止系統破壞你的活動,它仍保留在一個Bundle(鍵值對的BLOB)查看對象(如在一個EditText文本)和恢復狀態他們如果用戶導航回到活動的同一個實例。
CommonsWare here說:
當用戶「按下返回按鈕」,然後從 的onSaveInstanceState()的包(如果有的話)被丟棄,因爲用戶已經指示他們 完成與活動。 onSaveInstanceState()Bundle 用於用戶沒有說他們已完成活動(例如,他們接受了來電)但Android 選擇銷燬活動以釋放RAM的情況。
和文檔說:
注意,它保存的onPause(持久性數據)的onSaveInstanceState(捆綁),而不是 因爲以後是不是 生命週期回調的一部分是很重要的,所以會在其文檔中描述的 在任何情況下都不會被調用。
換句話說,把你的保存/恢復的代碼不查看對象的onPause()和的onResume()代替的onSaveInstanceState(束)和onRestoreInstanceState(捆綁)。 最後,我猜你並不需要保存任何狀態,如果你只需要查看對象,如果您有任何其他國家可以使用preferences
,file
或sqlite
將它們保存在onPause()
和onResume()
retreive他們。
您可以在這些頁面查看更多細節:
Stopping and Restarting an Activity
Saving Activity state in Android
Android wont save the current state of an activity
- 1. MainActivity外使用onResume()和onPause()
- 2. OnPause(),OnResume()和OnDestroy
- 3. onPause和onResume方法使用sharedPreferences
- 4. ViewPager調用onPause()onResume()
- 5. WidgetLocker onResume onPause
- 6. GLSurfaceView生命週期方法onPause()和onResume()
- 7. MediaPlayer在onPause和onResume後無法工作
- 8. onPause,Android中的onResume事件
- 9. onPause()/ onResume()中的GLSurface問題
- 10. onPause/onResume活動問題
- 11. onPause/onResume後無法繪製
- 12. 在應用程序中使用OnPause和OnResume
- 13. 當我按下按鈕時,如何使用onResume和onPause方法
- 14. GLSurfaceView:我需要調用onPause/onResume嗎?
- 15. onResume/onPause在iOS應用程序上
- 16. onPause和onResume之間的應用程序崩潰Listview問題
- 17. 的onPause,等等的onResume在兜圈子:-(
- 18. 如何處理的onPause /的onResume爲GLSurfaceView
- 19. 關於Android的onResume和onPause方法的說明
- 20. Ionic 2 OnPause和OnResume上一頁不保留?
- 21. 的onPause()和的onResume()命令替換片段
- 22. 如何使用RxJava 2使用onResume()和onPause()方法來訂閱和取消訂閱?
- 23. Android:在onPause和onResume之間保存用戶定義對象的ArrayList
- 24. Android - 如何正確處理onPause/onResume方法?
- 25. Android - 刪除谷歌地圖片段OnPause並加回onResume
- 26. 如何停止線程在onBackPressed或onPause或OnResume
- 27. 如何處理onResume中的LiveData項目 - 僅限onPause狀態?
- 28. OnPause onResume中的計時器會發生什麼變化
- 29. 在onPause和onResume之間傳輸數據的最佳方式是什麼?
- 30. Android - onPause和WidgetLocker
@ user1576427請參閱我的編輯。 – hasanghaforian 2012-08-11 12:44:00