從後臺切回來,你不想展現點廣告嗎?

版權聲明:安全

本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。app

未經容許,不得轉載。post

1、前言

在使用一些攜帶廣告的 App 的時候,常常會碰到,第二次啓動的時候,會首先進入一個閃屏的廣告頁面,而後廣告倒計時退出以後,才恢復到咱們上次最後停留的頁面上。3d

注意這樣的功能,並不是首次啓動的時候,在啓動頁的出現的廣告,而是在 App 內任意頁面退出到後臺,再次進入以後,出現一個廣告頁面,以後回退到最後停留的頁面。component

那麼這樣的功能,固然也不只僅適用於廣告,一些安全級別較高的 App 也會有要求退出後臺一段時間再進入的時候,須要從新輸入密碼。那麼它應該如何來實現呢?cdn

2、思路和解決方案

實際上這樣一個功能,惟一的難點是在什麼時機去啓動承載廣告的頁面。對象

一、方案一,利用ActivityLifecycleCallbacks

以前有過一個思路,就是利用 ActivityLifecycleCallbacks 中,經過管理各類 Activity 的生命週期,來判斷 App 退出到後臺又進入到前臺了。blog

對 ActivityLifecycleCallbacks 的原理不那麼瞭解的朋友,能夠看看以前的文章《ActivityLifecycleCallbacks》。接口

其實現方式就是在 onActivityPaused() 方法的時候 postDelayed() 一個 Runnable,大概延遲 500 毫秒,而後在 onActivityResumed() 的時候,移除掉此 Runnable。生命週期

原理就是,若是正常的頁面跳轉,一個 Activity 走到了 onActivityPaused() ,應該立刻就有另一個 Activity 走到了 onActivityResume() ,這是一個正常的頁面跳轉,反之,則認爲是退出到後臺了。

關鍵代碼以下:

二、方案二:ActivityLifecycleCallbacks + ComponentCallbacks2

其實方案一,單純的使用 ActivityLifecycleCallbacks 來做爲依據,判斷當前 App 是退出到後臺又再次進來,是徹底足夠的。

可是實際上,還有另一種方法來輔助判斷,當前 Activity 退出到後臺了。

那就是 Application.onTrimMemory() 的回調中, level 參數爲 TRIM_MEMORY_UI_HIDDEN 的時候,就是 App 退出到後臺的時機。

固然,咱們也能夠經過 Application.registerComponentCallbacks() 方法,來註冊一個回調對象,在其中處理 onTrimMemory() 的邏輯。

有關 onTrimMemory() ,不那麼瞭解的朋友,也能夠先看看以前的文章《omTrimMemory》

那麼和方案一參考起來,惟一就是去掉了 Handler 去延遲判斷,直接依賴 onTrimMemory() 方法來判斷 App 退出到後臺,而後下次有Activity 走到 onResume() 的時候,就認爲是從後臺再次啓動,就能夠去啓動咱們的廣告頁面了。

爲了便於封裝,咱們能夠單獨寫一個類 SplashAdWrapper ,而後分別實現 ActivityLifecycleCallbacks 和 ComponentCallbacks2 接口。

首先在 onTrimMemory() 中,監聽 App 退出到後臺,並增長標識位。

而後在 onActivityResumed() 的時候,判斷標識位來肯定是不是從後臺進入的前臺。

最後在 SplashAdWrapper 的構造方法中,經過 Application 對這兩個接口進行註冊。

而後就只須要在 Application.onCreate() 方法中,構造 SplashAdWrapper 便可。

最後運行看一下效果,各類後臺前臺切換,發現並無什麼問題。

三、方案的優缺點

這兩種方案,方案一須要依賴一個 Handler 去延遲判斷,而方案二,剔除了 Handler 的延遲判斷,依賴 Android 本身的 Api 來作進入後臺的判斷,會更優雅一些。

還有一個問題就是,無論使用那種方案,依賴的 Api 都是 Android Level 14(Android 4.0) 以上,因此對於低於 4.0 一下的設備,能夠考慮放棄掉這些設備廣告的展示。若是必須使用的話,就只能使用方案一,而且構造一個 Activity 的父類,在其中將全部什麼週期方法,統一管理來進行處理。

3、小結

前面也提到了,這種方案並非只能使用在啓動廣告上,對於一些須要錄入密碼的,也能夠計算退出到後臺的時長,若是大於一個安全值,就須要從新輸入密碼,來保證安全。

實現方法在這裏,怎麼使用就看你本身了。

相關文章
相關標籤/搜索