Activity 生命週期,如何一手掌控

承香墨影發表於2019-02-19

版權宣告:

本賬號釋出文章均來自公眾號,承香墨影(cxmyDev),版權歸承香墨影所有。

未經允許,不得轉載。

一、前言

對於一個 Activity 而言,它是有固定的生命週期的,但是它只是對於 Activity 自身的一種管理。如果有需求需要對 App 內,所有 Activity 的生命週期進行管理的話,就需要另行處理了。

這個時候,就可以用到 Android level 14 (Android 4.0) 新新增的 API ,AndroidLifecycleCallbacks 就可以對當前程式內所有的 Activity 進行統一的管理了。

二、什麼是AndroidLifecycleCallback

AndroidLifecycleCallback 是 Android 4.0 新新增的API ,它是一個 Application 內的公有介面。而使用它,也需要配合 Application 物件進行使用。

既然 AndroidLifecycleCallbacks 是全域性的管理 Activity 的生命週期,它自然需要對應出 Activity 的所有生命週期的方法。

可以看到,這裡的 AndroidLifecycleCallback 是一個介面,我們需要實現它。並通過 registerActivityLifecycleCallbacks() 方法,將其註冊到當前的 Application 物件上,在無需使用的時候,還需要呼叫 unregisterActivityLifecycleCallbacks() 進行解注。

從註冊和解注的方法實現中就可以看出來,它實際上就是通過一個 ArrayList 的陣列,mActivityLifecycleCallbacks 進行維護的,也就是說,我們可以在 Application 物件上新增多個 Callbacks 監聽。

而具體是何時使用它的,就是完全依賴於 Application 的一些方法了,就以 Activity.onCreate() 的監聽為例子。

這裡就是將 Callbacks 拿出來,迴圈呼叫對應的方法即可。

三、適用場景比如何使用更重要

其實 AndroidLifecycleCallback 的 API 非常的簡單,使用起來也並不複雜,所以說,在什麼場景下使用它,比如何使用它更重要

常見的一些使用場景:

1、為頁面新增統計

如果需要為每個頁面,新增頁面的PV、UV等統計的話,除了在每個 Activity 的對應宣告週期方法內,新增統計之外,就可以用到 AndroidLifecycleCallbacks 進行統一新增,便於管理。

2、一鍵退出所有頁面

既然可以對所有的 Activity 進行管理,當然可以做到一鍵退出所有 Activity 的功能。

3、判斷當前App是否在前臺

對於退出到後臺的 App ,一定有一個 Activity 走到了 onPause() 而幾乎同時沒有另外一個 Activity 走到了 onResume()。最簡單的一個實現方式,就是在 onActivityPaused() 的時候,使用 Handler 做一個延遲判斷,如果馬上就有另外一個 Activity 走到了 onActivityResume() 的時候,就將延遲訊息 remove 掉,否者認為是退出到後臺了。

四、LifecycleCallback 有什麼缺陷

其實 ActivityLifecycleCallbacks 整體來說,還是很方便實用的。但是它也有一些缺陷的地方,例如有 Api 限制、無法監聽到 Fragment 的生命週期等。

這裡簡單提一下對於這些問題的一個簡單的解決方案,例子就不擺出來了。

既然需要相容 Android 4.0 以下的裝置,而這又僅僅是用於監聽 Activity 的宣告週期,實際上我們是可以用一個 Activity 的父類,讓所有專案內的 Activity 都繼承於它,這樣的話,在這個父類中對應的宣告週期方法內,去分發對應的監聽回撥即可。而 Fragment 生命週期的監聽,思路也是如此的。

這一切如果實現起來覺得有點繁瑣,可以參見一個開源專案:

github.com/soarcn/Andr…

實際上它的思路和上面提到的思路是一樣的,只是封裝的更方便使用了,有需要的可以閱讀一下原始碼就清楚了。

五、小結

能監聽所有 Activity 的狀態,是一件非常有意義的事情,它能實現哪些功能,就需要根據實際的需求和發揮我們的想象力了。

相關文章