Activity isFinishing()判斷Activity的狀態(tài)實(shí)例
在Activity中調(diào)用finish()或按返回鍵退出時(shí),若有資源被其他對象引用不能釋放(如context被某個(gè)單例對象引用或正在線程中被使用),則activity不會(huì)被調(diào)用onDestory()方法。
isFinishing() 可用來判斷Activity是否處于活躍狀態(tài)(false)還是等待回收狀態(tài)(true)。
isDestroyed() 根據(jù)源碼注釋可知,只有onDestroy()方法被調(diào)用后它才返回true,因此實(shí)際用處不大。
查看源代碼中的注釋:
/** * Check to see whether this activity is in the process of finishing, * either because you called {@link #finish} on it or someone else * has requested that it finished. This is often used in * {@link #onPause} to determine whether the activity is simply pausing or * completely finishing. * * @return If the activity is finishing, returns true; else returns false. * * @see #finish */ public boolean isFinishing() { return mFinished; } /** * Returns true if the final {@link #onDestroy()} call has been made * on the Activity, so this instance is now dead. */ public boolean isDestroyed() { return mDestroyed; }
Activity onDestroy() 調(diào)用研究
剛剛一個(gè)BUG讓我發(fā)現(xiàn),如果 activity 實(shí)現(xiàn)了一個(gè)回調(diào)接口,然后使用 this 設(shè)置給需要回調(diào)接口的方法,這種應(yīng)用場景比較常見,最常見的就是實(shí)現(xiàn) onClickListener 接口,然后 findViewById().setOnClickListenr(this)
如果,這個(gè)回調(diào)接口設(shè)置到了一個(gè)靜態(tài)對象(單例模式),當(dāng) activity finish() 的時(shí)候(按返回鍵,回到桌面),則activity 不會(huì)被調(diào)用 onDestroy() ,原因可能是 activity 對象還在被引用!
此時(shí)你再點(diǎn)擊圖標(biāo)回到應(yīng)用,onCreate() 再次調(diào)用!
很明顯,如果你把資源釋放放在了 onDestroy() 里面,就會(huì)導(dǎo)致內(nèi)存泄露!
那有沒有解決辦法呢?
有的 你可以在 onPause() 方法里面判斷 isFinishing() ,正常調(diào)用 finish() 后 activity 的回調(diào)過程是 onPause、onStop、onDestroy ,倘若出現(xiàn)上面的情況,只到 onPause!但是 isFinishing() 標(biāo)志還是為 true !你可以釋放資源了。
以上這篇Activity isFinishing()判斷Activity的狀態(tài)實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android 個(gè)人理財(cái)工具二:使用SQLite實(shí)現(xiàn)啟動(dòng)時(shí)初始化數(shù)據(jù)
本文主要介紹 Android 使用SQLite實(shí)現(xiàn)啟動(dòng)時(shí)初始化數(shù)據(jù),這里對SQLite 的數(shù)據(jù)庫進(jìn)行詳解,附有示例代碼,有興趣的小伙伴可以參考下2016-08-08Android聊天工具基于socket實(shí)現(xiàn)
這篇文章主要介紹了基于socket實(shí)現(xiàn)的一個(gè)簡單的Android聊天工具,實(shí)現(xiàn)方法簡單,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2016-02-02Android開發(fā)EditText實(shí)現(xiàn)密碼顯示隱藏
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)EditText實(shí)現(xiàn)密碼顯示隱藏,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08制作獨(dú)立的Android模擬器實(shí)現(xiàn)方法
本文主要介紹如何制作獨(dú)立的Android模擬器,這里給大家提供詳細(xì)的制作流程,有需要的小伙伴可以參考下2016-08-08Android中的popupwindow進(jìn)入和退出的動(dòng)畫效果
這篇文章主要介紹了Android中的popupwindow進(jìn)入和退出的動(dòng)畫,需要的朋友可以參考下2017-04-04Android Flutter利用貝塞爾曲線畫一個(gè)小海豚
貝塞爾曲線的應(yīng)用填補(bǔ)了計(jì)算機(jī)繪制與手繪之前的差距,更能表達(dá)人想畫出的曲線。本文就將利用貝塞爾曲線繪制一個(gè)可愛的小海豚,需要的可以參考一下2022-04-04android為ListView每個(gè)Item上面的按鈕添加事件
本篇文章主要介紹了android為ListView每個(gè)Item上面的按鈕添加事件,有興趣的同學(xué)可以了解一下。2016-11-11Android 中實(shí)現(xiàn)ListView滑動(dòng)隱藏標(biāo)題欄的代碼
本文通過實(shí)例代碼給大家分享了android listview滑動(dòng)隱藏標(biāo)題欄的方法,代碼簡單易懂,需要的朋友參考下2017-01-01Android編程判斷SD卡是否存在及使用容量查詢實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程判斷SD卡是否存在及使用容量查詢實(shí)現(xiàn)方法,實(shí)例分析了Android針對SD卡是否存在及使用容量、全部容量等的判斷技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-10-10