Activity使用細(xì)節(jié)匯總

不滿足是向上的車輪


????????一直都有提筆想寫些什么,但每每提筆,又無從下手,感覺一切都是混亂的,沒有自成體系。近來正好閑暇頗多,便下決心整理一番。本文目錄結(jié)構(gòu)如下:

????生命周期簡述及常用回調(diào)函數(shù)

????啟動模式、任務(wù)棧

????數(shù)據(jù)保存及通信方式

生命周期簡述

關(guān)于描述activity生命周期的文章已經(jīng)很多了,這里就引用經(jīng)典圖例一張及我們在使用生命周期函數(shù)的注意事項(xiàng)。


????????1. 啟動Activity:系統(tǒng)會先調(diào)用onCreate方法,然后調(diào)用onStart方法,最后調(diào)用onResume,Activity進(jìn)入運(yùn)行狀態(tài)。

????????2. Activity被部分遮住(當(dāng)前activity為透明狀態(tài),如設(shè)置activity屬性windowIsTranslucent為true或android:theme= "@android:style/Theme.Translucent.NoTitleBar.Fullscreen"):系統(tǒng)會調(diào)用onPause方法,暫停當(dāng)前Activity的執(zhí)行,恢復(fù)時調(diào)用onResume。但是若當(dāng)前activity是被彈出的Dialog、PopWindow遮擋,并不會執(zhí)行onPause,彈出窗消失時activity也不會執(zhí)行onResume,彈出窗依附于當(dāng)前activity的上下文,屬于與當(dāng)前activity正常交互,感興趣的小伙伴可以試試。

????????3. 橫豎屏切換會重新創(chuàng)建activity,當(dāng)然設(shè)置android:configChanges="orientation|keyboardHidden|screenSize"例外。

????????4. 當(dāng)前Activity被完全遮?。ㄞD(zhuǎn)到新的Activity界面或按Home鍵回到主屏,自身退居后臺):系統(tǒng)會先調(diào)用onPause方法,然后調(diào)用onStop方法,進(jìn)入停滯狀態(tài)。

????????5. 用戶后退回到此Activity:系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法,最后調(diào)用onResume方法,再次進(jìn)入運(yùn)行狀態(tài)。

????????6. 當(dāng)前Activity處于后臺不可見狀態(tài),系統(tǒng)內(nèi)存不足,殺死當(dāng)前Activity,而后用戶退回當(dāng)前Activity:再次調(diào)用onCreate方法、onStart方法、onResume方法,進(jìn)入運(yùn)行狀態(tài)。

????????7. 用戶退出當(dāng)前Activity:系統(tǒng)先調(diào)用onPause方法,然后調(diào)用onStop方法,最后調(diào)用onDestory方法,結(jié)束當(dāng)前Activity。

常用回調(diào)函數(shù)

????????1. 生命周期函數(shù)肯定是最常用的幾個函數(shù),但是當(dāng)我們在使用過程中需注意生命周期是成對的,尤其是我們在綁定某些資源、接口的時候,需要成對使用。

????????比如EventBus、廣播的注冊,在onStart中注冊廣播,就需要在onStop中解綁,倘若在onStart中注冊廣播,在onDestroy中解綁,那么就可能出現(xiàn)多次注冊該廣播,然而最終注銷的只有一個,最終造成receiver泄露。而某些機(jī)型會對receiver進(jìn)行資源管控,當(dāng)該應(yīng)用注冊過多receiver,管控模塊拋出異常,應(yīng)用FC。

? ? ? ? 2. onBackPressed(),重寫當(dāng)前activity的返回事件,比如點(diǎn)擊兩次返回鍵退出應(yīng)用、點(diǎn)擊返回鍵先收起菜單、彈出框等操作。

? ? ? ? 3.onSaveInstanceState()、onRestoreInstanceState(), 主要做activity在意外情況下被銷毀的數(shù)據(jù)保存與恢復(fù)工作,但是這兩個函數(shù)并不是成對出現(xiàn),當(dāng)前activity進(jìn)入后臺,或配置信息反生改變而Manifest文件中又沒有對當(dāng)前activity進(jìn)行配置,onSaveInstanceState就會被回調(diào),但是只有當(dāng)activity由于系統(tǒng)內(nèi)存不足等原因被意外kill,而又需要馬上重建恢復(fù)的時候onRestoreInstanceState才會被回調(diào)。

????????4. onNewIntent(),配合singleTop與singleTask兩種啟動模式使用。

? ? ? ? 5. startActivityForResult、onActivityResult()、setResult(), 這個組合通常用于攜帶數(shù)據(jù)跳轉(zhuǎn)到另一個界面,完成某些操作并攜帶回?cái)?shù)據(jù)。

? ? ? ? 6. Activity隱式跳轉(zhuǎn)注意規(guī)避ActivityNotFoundException 的異常,因?yàn)锳ctivity 間通過隱式 Intent 的跳轉(zhuǎn),有可能找不到合適的調(diào)用組件,在發(fā)出 Intent 之前必須通過 resolveActivity檢查,造成 ActivityNotFoundException 的異常。常用寫法如下:

啟動模式、任務(wù)棧

? ? ? ? 眾所周知,每當(dāng)創(chuàng)建一個新activity實(shí)例的時候,該實(shí)例都會push到Activity Stack中,四種啟動模式就關(guān)系到入棧與出棧,standard標(biāo)準(zhǔn)模式、singleTop棧頂復(fù)用模式、singleTask棧內(nèi)復(fù)用模式、singleInstance單實(shí)例模式,這里僅簡述其特性及使用場景。

1、Standard

? ? ? ? 特點(diǎn):無論如何都會創(chuàng)建新的activity實(shí)例;

? ? ? ? 應(yīng)用場景:展示不同的頁面,例如:列表頁和詳情頁。

2、SingleTop

? ? ? ? 特點(diǎn):需要跳轉(zhuǎn)的activity就是當(dāng)前activity,即位于棧頂,就不再創(chuàng)建新實(shí)例,刷新頁面數(shù)據(jù)需覆蓋onNewIntent方法;

? ? ? ? 應(yīng)用場景:如展示通知詳情。

3、SingleTask

? ? ? ? 特點(diǎn):若當(dāng)前activity位于當(dāng)前應(yīng)用的stack中,不再創(chuàng)建新的實(shí)例,會銷毀當(dāng)前棧中所有位于他上面的activity,因此需要慎用;

? ? ? ? 應(yīng)用場景:整個應(yīng)用中只需要唯一的實(shí)例,例如:應(yīng)用首頁、主頁,通常會有在列表、詳情、其他模塊子頁面中一鍵回到主頁的需求;閱讀、視頻播放界面,通常在閱讀、播放界面我們可以瀏覽其他資源,然后進(jìn)行播放。

????????使用該模式與SingleTop目的都是盡量少創(chuàng)建activity實(shí)例,降低資源開銷,同時避免有多個相同頁面被展示出來,點(diǎn)擊返回鍵多次點(diǎn)擊都是相同頁面,提高用戶體驗(yàn)。

4、singleInstance

? ? ? ? 特點(diǎn):會創(chuàng)建新的任務(wù)棧,activity不會進(jìn)入當(dāng)前應(yīng)用的任務(wù)棧中,acitivity已經(jīng)存在,系統(tǒng)會讓存儲該activity的棧轉(zhuǎn)到前臺并展示出來;

? ? ? ? 應(yīng)用場景:公共的模塊,可以被不同應(yīng)用共用的功能,與當(dāng)前應(yīng)用分離開,例如:鬧鈴、天氣、日歷等。

? ? ? ? 通常我們可以通過維護(hù)自定義activity棧,方便操作activity實(shí)例,統(tǒng)一添加進(jìn)入、退出動畫,同事可以通過定義BaseActivity,用于統(tǒng)一定義Activity的狀態(tài)欄、標(biāo)題欄樣式、網(wǎng)絡(luò)狀態(tài)等。下面說說通常維護(hù)自定義任務(wù)棧的做法:

1、繼承Application,注冊registerActivityLifecycleCallbacks,一般在onCreate()里處理;

2、實(shí)現(xiàn)ActivityLifecycleCallbacks接口,與第一步呼應(yīng)可在onTerminate()中解綁注冊;

3、維護(hù)自定義Stack,在ActivityLifecycleCallbacks接口的onActivityCreated()回調(diào)方法中入棧,在onActivityDestroyed()中出棧并銷毀;

????????我們不僅僅可以利用ActivityLifecycleCallbacks接口維護(hù)自定義棧,因?yàn)樗蠥ctivity的生命周期都會在這里回調(diào),我們可以根據(jù)條件隨心處理,以便能在同一生命周期中統(tǒng)一處理所有activity的事務(wù),相當(dāng)便捷。

數(shù)據(jù)保存及通信方式

????????總所周知的函數(shù)onSaveInstanceState()與onRestoreInstanceState(),但是值得注意的是這兩個函數(shù)并不一定被調(diào)用是成對出現(xiàn)的,詳細(xì)描述見第一部分第三點(diǎn)。因此這里通常作部分UI狀態(tài)、成員變量保存,持久化數(shù)據(jù)保存通常在onPause()中處理;此外,onRestoreInstanceState()與onCreate()中所帶Bundel參數(shù)是一致的。

Activity間通信方式:

1、Intent;

2、Broadcast,實(shí)質(zhì)也是Intent;

3、靜態(tài)變量(慎用,注意內(nèi)存泄漏,以及多線程狀態(tài)下的調(diào)用);

4、Application 共享;

5、SharedPreference、DataBase、File(多用于數(shù)據(jù)緩存,而不用于數(shù)據(jù)傳遞,但也可以實(shí)現(xiàn)數(shù)據(jù)傳遞);

6、ClipBoard,應(yīng)用程序內(nèi)部共享數(shù)據(jù),也可以進(jìn)程間的數(shù)據(jù)共享,支持文本、二進(jìn)制數(shù)據(jù)流或其它復(fù)雜的數(shù)據(jù)(注意隱私數(shù)據(jù)的保護(hù),因?yàn)樵摲绞绞窍到y(tǒng)級別的,所有應(yīng)用程序都可以獲得,也可以篡改)


? ? ? ? 上述部分僅僅是個人工作經(jīng)驗(yàn)的總結(jié),必然有不完善之處與不準(zhǔn)確的地方,歡迎大家留言補(bǔ)充、討論,當(dāng)然也歡迎大家多多點(diǎn)贊^-^ ^-^

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容