Activity 生命周期,如何一手掌控
一、前言
對于一個 Activity 而言,它是有固定的生命周期的,但是它只是對于 Activity 自身的一種管理。如果有需求需要對 App 內(nèi),所有 Activity 的生命周期進行管理的話,就需要另行處理了。
這個時候,就可以用到 Android level 14 (Android 4.0) 新添加的 API ,AndroidLifecycleCallbacks 就可以對當前進程內(nèi)所有的 Activity 進行統(tǒng)一的管理了。
二、什么是AndroidLifecycleCallback
AndroidLifecycleCallback 是 Android 4.0 新添加的API ,它是一個 Application 內(nèi)的公有接口。而使用它,也需要配合 Application 對象進行使用。
既然 AndroidLifecycleCallbacks 是全局的管理 Activity 的生命周期,它自然需要對應出 Activity 的所有生命周期的方法。
可以看到,這里的 AndroidLifecycleCallback 是一個接口,我們需要實現(xiàn)它。并通過 registerActivityLifecycleCallbacks() 方法,將其注冊到當前的 Application 對象上,在無需使用的時候,還需要調(diào)用 unregisterActivityLifecycleCallbacks() 進行解注。
從注冊和解注的方法實現(xiàn)中就可以看出來,它實際上就是通過一個 ArrayList 的數(shù)組,mActivityLifecycleCallbacks 進行維護的,也就是說,我們可以在 Application 對象上添加多個 Callbacks 監(jiān)聽。
而具體是何時使用它的,就是完全依賴于 Application 的一些方法了,就以 Activity.onCreate() 的監(jiān)聽為例子。
這里就是將 Callbacks 拿出來,循環(huán)調(diào)用對應的方法即可。
三、適用場景比如何使用更重要
其實 AndroidLifecycleCallback 的 API 非常的簡單,使用起來也并不復雜,所以說,在什么場景下使用它,比如何使用它更重要。
常見的一些使用場景:
1、為頁面添加統(tǒng)計
如果需要為每個頁面,添加頁面的PV、UV等統(tǒng)計的話,除了在每個 Activity 的對應聲明周期方法內(nèi),添加統(tǒng)計之外,就可以用到 AndroidLifecycleCallbacks 進行統(tǒng)一添加,便于管理。
2、一鍵退出所有頁面
既然可以對所有的 Activity 進行管理,當然可以做到一鍵退出所有 Activity 的功能。
3、判斷當前App是否在前臺
對于退出到后臺的 App ,一定有一個 Activity 走到了 onPause() 而幾乎同時沒有另外一個 Activity 走到了 onResume()。最簡單的一個實現(xiàn)方式,就是在 onActivityPaused() 的時候,使用 Handler 做一個延遲判斷,如果馬上就有另外一個 Activity 走到了 onActivityResume() 的時候,就將延遲消息 remove 掉,否者認為是退出到后臺了。
四、LifecycleCallback 有什么缺陷
其實 ActivityLifecycleCallbacks 整體來說,還是很方便實用的。但是它也有一些缺陷的地方,例如有 Api 限制、無法監(jiān)聽到 Fragment 的生命周期等。
這里簡單提一下對于這些問題的一個簡單的解決方案,例子就不擺出來了。
既然需要兼容 Android 4.0 以下的設備,而這又僅僅是用于監(jiān)聽 Activity 的聲明周期,實際上我們是可以用一個 Activity 的父類,讓所有項目內(nèi)的 Activity 都繼承于它,這樣的話,在這個父類中對應的聲明周期方法內(nèi),去分發(fā)對應的監(jiān)聽回調(diào)即可。而 Fragment 生命周期的監(jiān)聽,思路也是如此的。
這一切如果實現(xiàn)起來覺得有點繁瑣,可以參見一個開源項目:
https://github.com/soarcn/AndroidLifecyle
實際上它的思路和上面提到的思路是一樣的,只是封裝的更方便使用了,有需要的可以閱讀一下源碼就清楚了。
五、小結(jié)
能監(jiān)聽所有 Activity 的狀態(tài),是一件非常有意義的事情,它能實現(xiàn)哪些功能,就需要根據(jù)實際的需求和發(fā)揮我們的想象力了。
【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】