3 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
正如其他人和此處所述,Android 會(huì)自動(dòng)為您處理。但是,如果你需要明確地添加任何東西去/來(lái)/從后臺(tái)狀態(tài),那么你也可以重寫(xiě)時(shí)onSaveInstanceState()
和onRestoreInstanceState()
將被相應(yīng)地調(diào)用方法。
當(dāng)您的 Activity 開(kāi)始停止時(shí),系統(tǒng)會(huì)調(diào)用該
onSaveInstanceState()
方法,以便您的 Activity 可以將狀態(tài)信息保存到實(shí)例狀態(tài)包中。此方法的默認(rèn)實(shí)現(xiàn)保存有關(guān) Activity 視圖層次結(jié)構(gòu)狀態(tài)的瞬態(tài)信息,例如EditText
小部件中的文本或小部件的滾動(dòng)位置ListView
。要為您的 Activity 保存其他實(shí)例狀態(tài)信息,您必須覆蓋
onSaveInstanceState()
并將鍵值對(duì)添加到在Bundle
您的 Activity 意外銷(xiāo)毀時(shí)保存的 對(duì)象。如果您覆蓋onSaveInstanceState()
,并且您希望默認(rèn)實(shí)現(xiàn)保存視圖層次結(jié)構(gòu)的狀態(tài),則必須調(diào)用超類(lèi)實(shí)現(xiàn)。
@Override
protected void onRestoreInstanceState(Bundle outState) {
if (outState != null) {
Crashlytics.log(1, "FormActivity", "Method:onRestoreInstanceState, Msg: saved instance is not null");
if (outState.containsKey("record")
&& Session.getCurrentRecord() == null) {
Session.setCurrentRecord(
gson.fromJson(
outState.getString("record"),
Record.class
)
);
}
if (outState.containsKey("user")
&& Session.getCurrentUser() == null) {
Session.setCurrentUser(
gson.fromJson(
outState.getString("user"),
User.class
)
);
}
}
super.onRestoreInstanceState(outState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Session.setCurrentRecord(record);
outState.putString("record", gson.toJson(Session.getCurrentRecord()));
outState.putString("user", gson.toJson(Session.getCurrentUser()));
super.onSaveInstanceState(outState);
}

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
這是由android系統(tǒng)自動(dòng)完成的。
現(xiàn)在為什么您可能無(wú)法注意到您的應(yīng)用程序的這種行為。
您可能正在從應(yīng)用啟動(dòng)器啟動(dòng)您的應(yīng)用。這意味著您已經(jīng)將所有其他應(yīng)用程序(啟動(dòng)器除外)置于后臺(tái)?,F(xiàn)在,根據(jù)啟動(dòng)器設(shè)置,當(dāng)您按下后退按鈕時(shí),您可能會(huì)從啟動(dòng)應(yīng)用程序的位置進(jìn)入頁(yè)面或主頁(yè)。
你什么時(shí)候可以觀察到這種行為
如果您的活動(dòng)是從后臺(tái)服務(wù)啟動(dòng)的,例如廣播接收器
如果您的活動(dòng)是通過(guò)單擊通知按鈕啟動(dòng)的
基本上,當(dāng)您的活動(dòng)創(chuàng)建時(shí)沒(méi)有殺死或?qū)⑵渌麘?yīng)用程序置于后臺(tái),當(dāng)您的應(yīng)用程序關(guān)閉時(shí),您將返回到同一個(gè)應(yīng)用程序。
例外 - 如果您使用主頁(yè)按鈕,所有應(yīng)用程序都會(huì)轉(zhuǎn)到后臺(tái)并顯示主屏幕。
希望這可以幫助。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
這是關(guān)于如何保留 UI 狀態(tài)的官方文檔:
https://developer.android.com/topic/libraries/architecture/saving-states
如果用戶將手機(jī)配置為始終在后臺(tái)終止活動(dòng)或者他們的資源有限,那么您必須處理它,但在某些情況下(您的活動(dòng)沒(méi)有被終止并保留在內(nèi)存中),因?yàn)?Mayank 回答系統(tǒng)會(huì)為您完成.
從電話應(yīng)用程序接聽(tīng)電話將中斷您的應(yīng)用程序(系統(tǒng)啟動(dòng)的 UI 狀態(tài)解除)您應(yīng)該按照上述文檔的建議執(zhí)行的操作:
在部分:管理 UI 狀態(tài):分而治之
本地持久性:存儲(chǔ)您在打開(kāi)和關(guān)閉活動(dòng)時(shí)不想丟失的所有數(shù)據(jù)。示例:歌曲對(duì)象的集合,其中可能包括音頻文件和元數(shù)據(jù)。
ViewModel:將顯示關(guān)聯(lián)的 UI 控制器所需的所有數(shù)據(jù)存儲(chǔ)在內(nèi)存中。示例:最近搜索和最近搜索查詢的歌曲對(duì)象。
onSaveInstanceState():如果系統(tǒng)停止然后重新創(chuàng)建 UI 控制器,則存儲(chǔ)輕松重新加載活動(dòng)狀態(tài)所需的少量數(shù)據(jù)。不是在此處存儲(chǔ)復(fù)雜對(duì)象,而是將復(fù)雜對(duì)象持久保存在本地存儲(chǔ)中,并將這些對(duì)象的唯一 ID 存儲(chǔ)在 onSaveInstanceState() 中。示例:存儲(chǔ)最近的搜索查詢。
因此,在您的情況下,有一個(gè)視圖模型可以存儲(chǔ)收到呼叫時(shí)的 URL 和視頻時(shí)間
我還會(huì)使用正確的生命周期鉤子在 instanceState 中存儲(chǔ)相同的信息
這是一個(gè)很好的 SO 線程,其中包含有關(guān)如何使用 savedInstanceState 的示例: Saving Android Activity state using Save Instance State
它有新舊答案,您可能需要通讀一遍以了解事情如何隨著時(shí)間的推移而發(fā)生變化
基本上上面三個(gè)要點(diǎn)是官方文檔推薦的策略
添加回答
舉報(bào)