Android實現(xiàn)后臺返回前臺再次顯示廣告

Android實現(xiàn)后臺返回前臺再次顯示廣告

市面上主流的APP都是在啟動頁做廣告展示的,即通常都是叫SplashActivity的是APP的launcher頁面,在manifest文件中配置, 2017年以來, 你會發(fā)現(xiàn)越來越多的APP在進入后臺時隔一定時間后再次回到前臺會再次顯示廣告界面, 3s自動播放, 或者手動點擊跳過

1461514126877_.pic.jpg

比如網(wǎng)易云音樂, 淘寶, 京東商城啦, 似乎現(xiàn)在都是很主流的做法了,剛好最近項目中也有這樣的需求, 我們也實現(xiàn)了一遍,所以寫出來分享下,相互學(xué)習(xí)借鑒

要實現(xiàn)后臺返回前臺顯示廣告的邏輯, 主要的點在于監(jiān)聽APP進入后臺的時間點, 和APP從后臺返回到前臺的時間點

我們是在Application子類中完成的, 定義三個常量記錄當(dāng)前APP狀態(tài)

 // 正常狀態(tài)
public static final int STATE_NORMAL = 0;
// 從后臺回到前臺
public static final int STATE_BACK_TO_FRONT = 1;
// 從前臺進入后臺
public static final int STATE_FRONT_TO_BACK = 2;

在Application中需要監(jiān)聽Activity的生命周期變化, registerActivityLifecycleCallbacks是application類已經(jīng)提供好的一個方法, 它可以非常方便的監(jiān)聽整個項目中的所有activity的生命周期

// Application類中的內(nèi)部類接口
public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}

可以很清晰的看到Activity的生命周期函數(shù)都會回調(diào)到ActivityLifecycleCallbacks接口來, 我們讓Application實現(xiàn)此接口, 并在相應(yīng)的回調(diào)方法中的完成具體的后臺狀態(tài)的監(jiān)聽

定義幾個需要用的變量記錄相關(guān)狀態(tài)和時間

// APP狀態(tài)
private static int sAppState = STATE_NORMAL;
// 標(biāo)記程序是否已進入后臺(依據(jù)onStop回調(diào))
private boolean flag;
// 標(biāo)記程序是否已進入后臺(依據(jù)onTrimMemory回調(diào))
private boolean background;
// 從前臺進入后臺的時間
private static long frontToBackTime;
// 從后臺返回前臺的時間
private static long backToFrontTime;

在onResume回調(diào)中監(jiān)聽回到前臺的判斷, 只要activity一旦獲取焦點這個方法都會觸發(fā),并且會觸發(fā)多次

@Override
public void onActivityResumed(@NonNull Activity activity) {
        if (background || flag) {
            background = false;
            flag = false;
            sAppState = STATE_BACK_TO_FRONT;
            backToFrontTime = System.currentTimeMillis();
            Log.e(TAG, "onResume: STATE_BACK_TO_FRONT");
            if (canShowAd()) {
                ShowADActivity.show(activity);
            }
        } else {
            sAppState = STATE_NORMAL;
        }
}

在onStop回調(diào)中監(jiān)聽程序進入后臺的判斷

@Override
public void onActivityStopped(@NonNull Activity activity) {
        //判斷當(dāng)前activity是否處于前臺
        if (!SystemUtils.isCurAppTop(activity)) {
            // 從前臺進入后臺
            sAppState = STATE_FRONT_TO_BACK;
            frontToBackTime = System.currentTimeMillis();
            flag = true;
            Log.e(TAG, "onStop: " + "STATE_FRONT_TO_BACK");
        } else {
            // 否則是正常狀態(tài)
            sAppState = STATE_NORMAL;
        }
 }

在onTrimMemory中監(jiān)聽?wèi)?yīng)用程序的切換,這也是一種監(jiān)聽方式.因為有時候onStop的回調(diào)不一定會完全執(zhí)行(尤其是切換最近使用APP列表時),所以這個方法也是必須的

@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    // TRIM_MEMORY_UI_HIDDEN是UI不可見的回調(diào), 通常程序進入后臺后都會觸發(fā)此回調(diào),大部分手機多是回調(diào)這個參數(shù)
    // TRIM_MEMORY_BACKGROUND也是程序進入后臺的回調(diào), 不同廠商不太一樣, 魅族手機就是回調(diào)這個參數(shù)
    if (level == Application.TRIM_MEMORY_UI_HIDDEN || level == TRIM_MEMORY_BACKGROUND) {
        background = true;
    } else if (level == Application.TRIM_MEMORY_COMPLETE) {
        background = !SystemUtils.isCurAppTop(this);
    }
    if (background) {
        frontToBackTime = System.currentTimeMillis();
        sAppState = STATE_FRONT_TO_BACK;
        logcat.e(TAG, "onTrimMemory: TRIM_MEMORY_UI_HIDDEN || TRIM_MEMORY_BACKGROUND");
    } else {
        sAppState = STATE_NORMAL;
    }

}

最后, 就可以得到當(dāng)前APP的準(zhǔn)確狀態(tài)(sAppState)了, 是否可以再次顯示廣告

/**
 * 進入后臺間隔10分鐘以后可以再次顯示廣告
 *
 * @return 是否能顯示廣告
 */
public static boolean canShowAd() {
    return sAppState == STATE_BACK_TO_FRONT &&
            (backToFrontTime - frontToBackTime) > 10 * 60 * 1000;
}

測試過程中,發(fā)現(xiàn)大部分品牌的手機都是OK的, 但是也有意外的,OPPO R9在切換應(yīng)用時,一個回調(diào)都沒觸發(fā),一定是Color OS改動太大, 目前尚無法處理.OV手機適配起來就是費勁啊

最后補充一個判斷程序是否前臺的API

/**
 * 判斷當(dāng)前程序是否前臺進程
 *
 * @param context
 * @return
 */
public static boolean isCurAppTop(Context context) {
    if (context == null) {
        return false;
    }
    String curPackageName = context.getPackageName();
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> list = am.getRunningTasks(1);
    if (list != null && list.size() > 0) {
        RunningTaskInfo info = list.get(0);
        String topPackageName = info.topActivity.getPackageName();
        String basePackageName = info.baseActivity.getPackageName();
        if (topPackageName.equals(curPackageName) && basePackageName.equals(curPackageName)) {
            return true;
        }
    }
    return false;
}

各位大佬們?nèi)绻懈玫膶崿F(xiàn),歡迎提供思路!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掏缎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掰担,更是在濱河造成了極大的恐慌,老刑警劉巖怒炸,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带饱,死亡現(xiàn)場離奇詭異,居然都是意外死亡阅羹,警方通過查閱死者的電腦和手機勺疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捏鱼,“玉大人执庐,你說我怎么就攤上這事〉及穑” “怎么了轨淌?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵迂烁,是天一觀的道長。 經(jīng)常有香客問我猿诸,道長婚被,這世上最難降的妖魔是什么狡忙? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任梳虽,我火速辦了婚禮,結(jié)果婚禮上灾茁,老公的妹妹穿的比我還像新娘窜觉。我一直安慰自己,他們只是感情好北专,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布禀挫。 她就那樣靜靜地躺著,像睡著了一般拓颓。 火紅的嫁衣襯著肌膚如雪语婴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天驶睦,我揣著相機與錄音砰左,去河邊找鬼。 笑死场航,一個胖子當(dāng)著我的面吹牛缠导,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溉痢,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼僻造,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孩饼?” 一聲冷哼從身側(cè)響起髓削,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镀娶,沒想到半個月后蔬螟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡汽畴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年旧巾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忍些。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲁猩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罢坝,到底是詐尸還是另有隱情廓握,我是刑警寧澤搅窿,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站隙券,受9級特大地震影響男应,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娱仔,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一沐飘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牲迫,春花似錦耐朴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陪每,卻和暖如春影晓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檩禾。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工挂签, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锌订。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓竹握,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辆飘。 傳聞我的和親對象是個殘疾皇子啦辐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容