日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何分析onSaveInstanceState和onRestoreInstanceState

這篇文章將為大家詳細(xì)講解有關(guān)如何分析onSaveInstanceState和onRestoreInstanceState,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),十余年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都1000+客戶提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷型網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),同時(shí)也為不同行業(yè)的客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選成都創(chuàng)新互聯(lián)公司。

一. 作用
 Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()、onPause()等生命周期方法,它們并不一定會(huì)被觸發(fā)。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足、用戶直接按Home鍵)由系統(tǒng)銷毀 一個(gè)Activity時(shí),onSaveInstanceState() 會(huì)被調(diào)用。但是當(dāng)用戶主動(dòng)去銷毀一個(gè)Activity時(shí),例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會(huì)被調(diào)用。因?yàn)樵谶@種情 況下,用戶的行為決定了不需要保存Activity的狀態(tài)。通常onSaveInstanceState()只適合用于保存一些臨時(shí)性的狀態(tài),而 onPause()適合用于數(shù)據(jù)的持久化保存。
在activity被殺掉之前調(diào)用保存每個(gè)實(shí)例的狀態(tài),以保證該狀態(tài)可以在 onCreate(Bundle)或者onRestoreInstanceState(Bundle) (傳入的Bundle參數(shù)是由onSaveInstanceState封裝好的)中恢復(fù)。這個(gè)方法在一個(gè)activity被殺死前調(diào)用,當(dāng)該 activity在將來某個(gè)時(shí)刻回來時(shí)可以恢復(fù)其先前狀態(tài)。

例如,如果activity B啟用后位于activity A的前端,在某個(gè)時(shí)刻activity A因?yàn)橄到y(tǒng)回收資源的問題要被殺掉,A通過onSaveInstanceState將有機(jī)會(huì)保存其用戶界面狀態(tài),使得將來用戶返回到activity A時(shí)能通過onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢復(fù)界面的狀態(tài)。

這就是onSaveInstanceState() 和 onRestoreInstanceState() 兩個(gè)函數(shù)的基本作用和用法。(ps:關(guān)于原理實(shí)現(xiàn)請(qǐng)追尋源碼,就是view的保存與繪制)
二. onSaveInstanceState的調(diào)用時(shí)機(jī)
當(dāng)某個(gè)activity變得“容易”被系統(tǒng)銷毀時(shí),該activity的onSaveInstanceState就會(huì)被執(zhí)行,除非該activity是被用戶主動(dòng)銷毀的,例如當(dāng)用戶按BACK鍵的時(shí)候。
注意上面的雙引號(hào),何為"容易"?意思就是說該activity還沒有被銷毀,而僅僅是一種可能性。這 種可能性有哪些?通過重寫一個(gè)activity的所有生命周期的onXXX方法,包括onSaveInstanceState()和 onRestoreInstanceState() 方法,我們可以清楚地知道當(dāng)某個(gè)activity(假定為activity A)顯示在當(dāng)前task的最上層時(shí),其onSaveInstanceState()方法會(huì)在什么時(shí)候被執(zhí)行,有這么幾種情況:

(1)、當(dāng)用戶按下HOME鍵時(shí)。
這是顯而易見的,系統(tǒng)不知道你按下HOME后要運(yùn)行多少其他的程序,自然也不知道activity A是否會(huì)被銷毀,因此系統(tǒng)會(huì)調(diào)用onSaveInstanceState(),讓用戶有機(jī)會(huì)保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則

(2)、長(zhǎng)按HOME鍵,選擇運(yùn)行其他的程序時(shí)。

(3)、按下電源按鍵(關(guān)閉屏幕顯示)時(shí)。

(4)、從activity A中啟動(dòng)一個(gè)新的activity時(shí)。

(5)、屏幕方向切換時(shí),例如從豎屏切換到橫屏?xí)r。

在屏幕切換之前,系統(tǒng)會(huì)銷毀activity A,在屏幕切換之后系統(tǒng)又會(huì)自動(dòng)地創(chuàng)建activity A,所以onSaveInstanceState()一定會(huì)被執(zhí)行,且也一定會(huì)執(zhí)行onRestoreInstanceState()。

總而言之,onSaveInstanceState()的調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)存在“未經(jīng)你許可”時(shí)銷毀了我們的activity的 可能時(shí),則onSaveInstanceState()會(huì)被系統(tǒng)調(diào)用,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便 你了)。如果調(diào)用,調(diào)用將發(fā)生在onPause()或onStop()方法之前。(雖然測(cè)試時(shí)發(fā)現(xiàn)多數(shù)在onPause()前)

三. onRestoreInstanceState()調(diào)用時(shí)機(jī)
onRestoreInstanceState() 被調(diào)用的前提是,activity A“確實(shí)”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會(huì)被調(diào)用,例如,當(dāng)正在顯示activity A的時(shí)候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會(huì)因?yàn)閮?nèi)存的原因被系統(tǒng)銷毀,故activity A的onRestoreInstanceState方法不會(huì)被執(zhí)行 此也說明上二者,大多數(shù)情況下不成對(duì)被使用。
onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之間調(diào)用。
四. onSaveInstanceState()方法的默認(rèn)實(shí)現(xiàn)
 如果我們沒有覆寫onSaveInstanceState()方法, 此方法的默認(rèn)實(shí)現(xiàn)會(huì)自動(dòng)保存activity中的某些狀態(tài)數(shù)據(jù), 比如activity中各種UI控件的狀態(tài).。android應(yīng)用框架中定義的幾乎所有UI控件都恰當(dāng)?shù)膶?shí)現(xiàn)了 onSaveInstanceState()方法,因此當(dāng)activity被摧毀和重建時(shí), 這些UI控件會(huì)自動(dòng)保存和恢復(fù)狀態(tài)數(shù)據(jù). 比如EditText控件會(huì)自動(dòng)保存和恢復(fù)輸入的數(shù)據(jù),而CheckBox控件會(huì)自動(dòng)保存和恢復(fù)選中狀態(tài).開發(fā)者只需要為這些控件指定一個(gè)唯一的ID(通 過設(shè)置android:id屬性即可), 剩余的事情就可以自動(dòng)完成了.如果沒有為控件指定ID, 則這個(gè)控件就不會(huì)進(jìn)行自動(dòng)的數(shù)據(jù)保存和恢復(fù)操作。

由上所述, 如果我們需要覆寫onSaveInstanceState()方法, 一般會(huì)在第一行代碼中調(diào)用該方法的默認(rèn)實(shí)現(xiàn):super.onSaveInstanceState(outState)。
五. 是否需要重寫onSaveInstanceState()方法
既然該方法的默認(rèn)實(shí)現(xiàn)可以自動(dòng)的保存UI控件的狀態(tài)數(shù)據(jù), 那什么時(shí)候需要覆寫該方法呢?

如果需要保存額外的數(shù)據(jù)時(shí), 就需要覆寫onSaveInstanceState()方法。大家需要注意的是:onSaveInstanceState()方法只適合保存瞬態(tài)數(shù)據(jù), 比如UI控件的狀態(tài), 成員變量的值等,而不應(yīng)該用來保存持久化數(shù)據(jù),持久化數(shù)據(jù)應(yīng)該當(dāng)用戶離開當(dāng)前的 activity時(shí),在 onPause() 中保存(比如將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)或文件中)。說到這里,還要說一點(diǎn)的就是在onPause()中不適合用來保存比較費(fèi)時(shí)的數(shù)據(jù),所以這點(diǎn)要理解。

由于onSaveInstanceState()方法方法不一定會(huì)被調(diào)用, 因此不適合在該方法中保存持久化數(shù)據(jù), 例如向數(shù)據(jù)庫(kù)中插入記錄等. 保存持久化數(shù)據(jù)的操作應(yīng)該放在onPause()中。若是永久性值,則在onPause()中保存;若大量,則另開線程吧,別阻塞UI線程。

六. 引發(fā)activity銷毀和重建的其它情況
除了系統(tǒng)處于內(nèi)存不足的原因會(huì)摧毀activity之外, 某些系統(tǒng)設(shè)置的改變也會(huì)導(dǎo)致activity的摧毀和重建. 例如改變屏幕方向(見上例), 改變?cè)O(shè)備語(yǔ)言設(shè)定, 鍵盤彈出等。

關(guān)于如何分析onSaveInstanceState和onRestoreInstanceState就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


網(wǎng)頁(yè)名稱:如何分析onSaveInstanceState和onRestoreInstanceState
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/jhohcg.html