前言
這周接到一個(gè)需求,需要在應(yīng)用從后臺切換到前臺時(shí),展示我們的廣告。展示頁面其實(shí)可以復(fù)用以前的開屏廣告頁,唯一的問題就是如何監(jiān)聽?wèi)?yīng)用從后臺切到了前臺。
正文
在眾多方法中,我采用了以下這種方式。廢話不多說,咱們直接看代碼:
//自定義Application類
public class MyApplication extends Application
在清單文件中聲明
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
在MyApplication里重寫onTrimMemory方法:
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if (level == TRIM_MEMORY_UI_HIDDEN) {
isBackGround = true;
Log.i("bo", "APP遁入后臺");
}
}
onTrimMemory方法為開發(fā)者提供了一個(gè)合適的時(shí)機(jī),用來釋放掉一些不用的資源,從而讓我們的應(yīng)用在后臺存活更長時(shí)間。其中l(wèi)evel參數(shù)就代表我們的應(yīng)用當(dāng)前在內(nèi)存中的狀態(tài),TRIM_MEMORY_UI_HIDDEN代表應(yīng)用從前臺切到了后臺。這個(gè)時(shí)候我們便可以標(biāo)記應(yīng)用切換到了后臺。
接下來需要監(jiān)聽?wèi)?yīng)用在什么時(shí)候回到了前臺:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
if (isBackGround) {
isBackGround = false;
Log.i("bo", "APP回到了前臺");
}
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
我們使用registerActivityLifecycleCallbacks來監(jiān)聽所有Activity的生命周期回調(diào),并在onActivityResumed方法中進(jìn)行判斷:調(diào)用了Activity的onResume方法,并且已經(jīng)標(biāo)記為后臺狀態(tài),那么就可以判斷APP回到了前臺。
以下是log輸出:

以上就是我對這個(gè)問題的解決方案。
結(jié)尾
這個(gè)方案要求API大于等于14,因?yàn)閞egisterActivityLifecycleCallbacks方法要求API在14以上。
最后,如有錯(cuò)誤,歡迎大家指正。