日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android应用开发—onSaveInstanceState方法什么时候被调用?

發(fā)布時間:2023/12/19 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用开发—onSaveInstanceState方法什么时候被调用? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自onSaveInstanceState方法什么時候被調(diào)用?(轉(zhuǎn)載/整理)

  • 在 Activity 被銷毀之前被調(diào)用來保存每個實(shí)例的狀態(tài),這樣就可以保證該狀態(tài)能夠從 onCreate(Bundle) 或者onRestoreInstanceState(Bundle)恢復(fù)過來。 本方法在 Activity 可能被銷毀前調(diào)用,這樣當(dāng)該 Activity 在將來某個時刻重新回來時可以恢復(fù)其之前的狀態(tài)。例如,如果 Activity B 啟用后位于 Activity A 的前端,在某個時刻 Activity A 因?yàn)橄到y(tǒng)回收資源的原因要被銷毀,Activity A 有機(jī)會通過 onSaveInstanceState() 來保存其用戶界面狀態(tài),使得將來用戶返回到 Activity A 的時候能夠通過 onCreate(Bundle) 或者onRestoreInstanceState(Bundle) 來恢復(fù)其界面狀態(tài)。不要將這個方法和 Activity 生命周期中的回調(diào)如 onPause() 或 onStop() 搞混淆了,onPause() 在 Activtiy 被放置到后臺或者自行銷毀時總會被調(diào)用,onStop() 在 Activity 被銷毀時被調(diào)用。一個會調(diào)用 onPause() 和 onStop() 但不會觸發(fā) onSaveInstanceState() 的例子是當(dāng)用戶從 Activity B 返回到 Activity A 時:沒有必要調(diào)用 B 的 onSaveInstanceState(Bundle)方法,因?yàn)榇藭r的 B 實(shí)例永遠(yuǎn)不會被恢復(fù),因此系統(tǒng)會避免調(diào)用它。一個調(diào)用 onPause() 但不調(diào)用 onSaveInstanceState(Bundle) 方法的例子是當(dāng) Activity B 啟動后處在 Activity A 的前端:如果在B的整個生命周期里 A 的用戶界面狀態(tài)都沒有被破壞的話,系統(tǒng)是不會調(diào)用 Activity A 的onSaveInstanceState(Bundle)方法。默認(rèn)的實(shí)現(xiàn)負(fù)責(zé)了大部分 UI 實(shí)例狀態(tài)的保存,采用的方式是調(diào)用 UI 層上每個擁有 id 的 view 的 onSaveInstanceState()方法 ,并且保存當(dāng)前獲得焦點(diǎn)的 view 的 id (所有保存的狀態(tài)信息都會在默認(rèn)的 onRestoreInstanceState(Bundle) 實(shí)現(xiàn)中恢復(fù))。如果你覆寫這個方法來保存額外的沒有被各個view保存的信息,你可能想要在默認(rèn)實(shí)現(xiàn)過程中調(diào)用或者自己保存每個視圖的所有狀態(tài)。如果被調(diào)用,這個方法會在 onStop() 前被觸發(fā),但系統(tǒng)并不保證是否在 onPause() 之前或者之后觸發(fā)。

  • Activity 中的 onSaveInstanceState() 方法和 onRestoreInstanceState() 方法并不是生命周期方法,它們不同于 onCreate()、onPause() 等生命周期方法,它們并不一定會被觸發(fā)。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足、用戶直接按Home鍵),由系統(tǒng)銷毀一個 Activity 時,onSaveInstanceState() 方法就會被調(diào)用。但是當(dāng)用戶主動去銷毀一個 Activity 時,例如在應(yīng)用中按返回鍵,onSaveInstanceState() 方法就不會被調(diào)用。因?yàn)樵谶@種情況下,用戶的行為決定了不需要保存Activity的狀態(tài)。通常onSaveInstanceState() 方法只適合用于保存一些臨時性的狀態(tài),而onPause() 方法適合用于數(shù)據(jù)的持久化保存。 另外,當(dāng)屏幕的方向發(fā)生了改變, Activity 會被銷毀并重新創(chuàng)建,如果你想在 Activity 被銷毀前緩存一些數(shù)據(jù),并且在 Activity 被重新創(chuàng)建后恢復(fù)緩存的數(shù)據(jù)。可以重寫 Activity 中的 onSaveInstanceState() 方法和 onRestoreInstanceState()方法,如下:

    public class PreferencesActivity extends Activity {private String name;protected void onRestoreInstanceState(Bundle savedInstanceState) {// 重新創(chuàng)建后恢復(fù)緩存的數(shù)據(jù)name = savedInstanceState.getString("name");super.onRestoreInstanceState(savedInstanceState);}protected void onSaveInstanceState(Bundle outState) {// 被銷毀前緩存一些數(shù)據(jù)outState.putString("name", "l_yqing");super.onSaveInstanceState(outState);} }
  • 當(dāng)用戶啟動一個新 Activity 之后,之前的 Activity 可能在內(nèi)存中處于停止?fàn)顟B(tài)也可能由于新 Activity 需要更多內(nèi)存而被系統(tǒng)銷毀了,但不論怎樣,當(dāng)用戶在新 Activity 上點(diǎn)擊返回鍵時,他希望看到的是原先的 Activity 的界面。原先的 Activity 如果是被重新創(chuàng)建的,那么它就要恢復(fù)到用戶最后看到它時的樣子,我們該怎么做呢?其實(shí)也不難,在 onPause() 、onStop() 或 onDestroy() 中保存必要的數(shù)據(jù)就行了。但是現(xiàn)在Google又冒出一個新的東西:onSaveInstanceState(),觀其名可知其意:它是專門用來保存實(shí)例狀態(tài)的,這個“實(shí)例”不是指的 Activity 對象,而是它所在的進(jìn)程,因?yàn)锳ctivity 的銷毀是因?yàn)樗诘倪M(jìn)程被殺掉而造成的。onSaveInstanceState()是在系統(tǒng)感覺需要銷毀Activity時調(diào)用的,它被傳入一個參數(shù)Bundle,這個Bundle可以被認(rèn)為是個 Map 字典之類的東西,用“鍵-值”的形式來保存數(shù)據(jù)。現(xiàn)在又叫人蛋疼了:不是可以在 onPause() 中保存數(shù)據(jù)嗎?為什么又搞出這樣一個家伙來?它們之間是什么關(guān)系呢? 原來,onSaveInstanceState() 方法的主要目的是保存和 Activity 的狀態(tài)有關(guān)的數(shù)據(jù),當(dāng)系統(tǒng)在銷毀 Activity 時,如果它希望 Activity 下次出現(xiàn)的樣子跟之前完全一樣,那么它就會調(diào)用onSaveInstanceState(),否則就不調(diào)用。所以要明白這一點(diǎn):onSaveInstanceState() 方法并不是永遠(yuǎn)都會調(diào)用。比如,當(dāng)用戶在一個 Activity 點(diǎn)擊返回鍵時,就不會調(diào)用,因?yàn)橛脩舸藭r明確知道這個 Activity 是要被銷毀的,并不期望下次它的樣子跟現(xiàn)在一樣(當(dāng)然開發(fā)者可以使它保持臨死時的表情,你非要這樣做,系統(tǒng)也沒辦法),所以就不用調(diào)用onSaveInstanceState()。現(xiàn)在應(yīng)該明白了:在onPause()、onStop() 以及 onDestroy() 中需要保存的是那些需要永久化的數(shù)據(jù),而不是保存用于恢復(fù)狀態(tài)的數(shù)據(jù),狀態(tài)數(shù)據(jù)有專門的方法:onSaveInstanceState()。數(shù)據(jù)保存在一個 Bundle 中,Bundle 被系統(tǒng)永久化。當(dāng)再調(diào)用 Activity 的onCreate()時,原先保存的 Bundle就被傳入,以恢復(fù)上一次臨死時的模樣,如果上次被銷毀時沒有保存 Bundle,則為 null。 還沒完呢,如果你沒有實(shí)現(xiàn)自己的 onSaveInstanceState(),但是 Activity 上控件的樣子可能依然能被保存并恢復(fù)。原來 Activity 類已實(shí)現(xiàn)了onSaveInstanceState(),在 onSaveInstanceState() 的默認(rèn)實(shí)現(xiàn)中,會調(diào)用所有控件的相關(guān)方法,把控件們的狀態(tài)都保存下來,比如 EditText 中輸入的文字、CheckBox 是否被選中等等。然而不是所有的控件都能被保存,這取決于你是否在 layout 文件中為控件賦了一個名字(android:id)。有名的就存,無名的不管。既然有現(xiàn)成的可用,那么我們到底還要不要自己實(shí)現(xiàn) onSaveInstanceState() 方法呢?這就得看情況了,如果你自己的派生類中有變量影響到UI,或你程序的行為,當(dāng)然就要把這個變量也保存了,那么就需要自己實(shí)現(xiàn),否則就不需要,但大多數(shù)情況肯定需要自己實(shí)現(xiàn)一下下了。對了,別忘了在你的實(shí)現(xiàn)中調(diào)用父類的 onSaveInstanceState() 方法。
    注:由于 onSaveInstanceState() 方法并不是在每次被銷毀時都會調(diào)用,所以不要在其中保存那些需要永久化的數(shù)據(jù),執(zhí)行保存那些數(shù)據(jù)的最好地方是在 onPause() 方法中。

轉(zhuǎn)自heiguy的專欄onSaveInstanceState和onRestoreInstanceState觸發(fā)的時機(jī)

先看Application Fundamentals上的一段話:

Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key) 從這句話可以知道,當(dāng)某個activity變得“容易”被系統(tǒng)銷毀時,該activity的onSaveInstanceState就會被執(zhí)行,除非該activity是被用戶主動銷毀的,例如當(dāng)用戶按BACK鍵的時候。 注意上面的雙引號,何為“容易”?言下之意就是該activity還沒有被銷毀,而僅僅是一種可能性。這種可能性有哪些?通過重寫一個activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當(dāng)某個activity(假定為activity A)顯示在當(dāng)前task的最上層時,

其onSaveInstanceState方法會在什么時候被執(zhí)行,有這么幾種情況:

  • 當(dāng)用戶按下HOME鍵時。 這是顯而易見的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會被銷毀,故系統(tǒng)會調(diào)用onSaveInstanceState,讓用戶有機(jī)會保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則
  • 長按HOME鍵,選擇運(yùn)行其他的程序時。
  • 按下電源按鍵(關(guān)閉屏幕顯示)時。
  • 從activity A中啟動一個新的activity時。
  • 屏幕方向切換時,例如從豎屏切換到橫屏?xí)r。

在屏幕切換之前,系統(tǒng)會銷毀activity A,在屏幕切換之后系統(tǒng)又會自動地創(chuàng)建activity A,所以onSaveInstanceState一定會被執(zhí)行 總而言之,onSaveInstanceState的調(diào)用遵循一個重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時銷毀了你的activity,則onSaveInstanceState會被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€機(jī)會讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)。

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調(diào)用的,onRestoreInstanceState被調(diào)用的前提是,activity A“確實(shí)”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調(diào)用,例如,當(dāng)正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會因?yàn)閮?nèi)存的原因被系統(tǒng)銷毀,故activity A的onRestoreInstanceState方法不會被執(zhí)行

另外,onRestoreInstanceState的bundle參數(shù)也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Android应用开发—onSaveInstanceState方法什么时候被调用?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。