監(jiān)聽activity從后臺(tái)切換到前臺(tái)

abstract class LifecycleApplication : Application(),
    Application.ActivityLifecycleCallbacks {

    companion object {
        // 正常狀態(tài)
        const val STATE_NORMAL = 0

        // 從后臺(tái)回到前臺(tái)
        const val STATE_BACK_TO_FRONT = 1

        // 從前臺(tái)進(jìn)入后臺(tái)
        const val STATE_FRONT_TO_BACK = 2

        //最大時(shí)間 10秒
        const val MAX_TIME = 1 * 1000

    }

    // APP狀態(tài)
    private var sAppState: Int = STATE_NORMAL

    // 標(biāo)記程序是否已進(jìn)入后臺(tái)(依據(jù)onStop回調(diào))
    private var flag = false

    // 標(biāo)記程序是否已進(jìn)入后臺(tái)(依據(jù)onTrimMemory回調(diào))
    private var background = false

    // 從前臺(tái)進(jìn)入后臺(tái)的時(shí)間
    private var frontToBackTime: Long = 0

    // 從后臺(tái)返回前臺(tái)的時(shí)間
    private var backToFrontTime: Long = 0


    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }


    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(this)
    }


    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
    }


    override fun onActivityStarted(activity: Activity) {}

    override fun onActivityResumed(activity: Activity) = if (background || flag) {
        background = false
        flag = false
        sAppState = STATE_BACK_TO_FRONT
        backToFrontTime = System.currentTimeMillis()
        if (isSplash()) {
            appResume(activity)
        } else {
        }
    } else {
        sAppState = STATE_NORMAL
    }

    override fun onActivityPaused(activity: Activity) {

    }

    override fun onActivityStopped(activity: Activity) {
        //判斷當(dāng)前activity是否處于前臺(tái)
        if (!AppUtil.isRunningForeground(this)) {
            // 從前臺(tái)進(jìn)入后臺(tái)
            sAppState = STATE_FRONT_TO_BACK
            frontToBackTime = System.currentTimeMillis()
            flag = true
        } else {
            // 否則是正常狀態(tài)
            sAppState = STATE_NORMAL
        }
    }

    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}

    override fun onActivityDestroyed(activity: Activity) {}

    override fun onTrimMemory(level: Int) {
        super.onTrimMemory(level)
        // TRIM_MEMORY_UI_HIDDEN是UI不可見的回調(diào), 通常程序進(jìn)入后臺(tái)后都會(huì)觸發(fā)此回調(diào),大部分手機(jī)多是回調(diào)這個(gè)參數(shù)
        // TRIM_MEMORY_BACKGROUND也是程序進(jìn)入后臺(tái)的回調(diào), 不同廠商不太一樣, 魅族手機(jī)就是回調(diào)這個(gè)參數(shù)
        if (level == TRIM_MEMORY_UI_HIDDEN || level == ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
            background = !AppUtil.isRunningForeground(this)
        } else if (level == TRIM_MEMORY_COMPLETE) {
            background = !AppUtil.isRunningForeground(this)
        }
        if (background) {
            frontToBackTime = System.currentTimeMillis()
            sAppState = STATE_FRONT_TO_BACK
        } else {
            sAppState = STATE_NORMAL
        }
    }

    /**
     * 進(jìn)入后臺(tái)間隔10秒以后可以再次顯示廣告
     * @return 是否能顯示廣告
     */
    private fun isSplash(): Boolean {
        return sAppState == STATE_BACK_TO_FRONT &&
                backToFrontTime - frontToBackTime > MAX_TIME
    }

    fun isBackToFront(): Boolean {
        return sAppState == STATE_BACK_TO_FRONT
    }


    open fun appResume(activity: Activity?) {

    }

    fun isRunningForeground(context: Context): Boolean {
        val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
        val processes = activityManager?.runningAppProcesses
        if (processes.isNullOrEmpty()) {
            return false
        } else {
            for (appProcessInfo in processes) {
                if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    if (appProcessInfo.processName == context.applicationInfo.processName) {
                        return true
                    }
                }
            }
        }
        return false
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • """1.個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中,并向該用戶顯示一條消息。顯示的消息應(yīng)非常簡(jiǎn)單,如“Hello ...
    她即我命閱讀 5,910評(píng)論 0 6
  • 1、expected an indented block 冒號(hào)后面是要寫上一定的內(nèi)容的(新手容易遺忘這一點(diǎn)); 縮...
    庵下桃花仙閱讀 1,168評(píng)論 1 2
  • 一、工具箱(多種工具共用一個(gè)快捷鍵的可同時(shí)按【Shift】加此快捷鍵選取)矩形、橢圓選框工具 【M】移動(dòng)工具 【V...
    墨雅丫閱讀 1,835評(píng)論 0 0
  • 跟隨樊老師和伙伴們一起學(xué)習(xí)心理知識(shí)提升自已,已經(jīng)有三個(gè)月有余了,這一段時(shí)間因?yàn)樘鞖獾脑蛐菡n,順便整理一下之前學(xué)習(xí)...
    學(xué)習(xí)思考行動(dòng)閱讀 1,203評(píng)論 0 2
  • 一臉憤怒的她躺在了床上,好幾次甩開了他抱過來的雙手,到最后還堅(jiān)決的翻了個(gè)身,只留給他一個(gè)冷漠的背影。 多次嘗試抱她...
    海邊的藍(lán)兔子閱讀 1,089評(píng)論 1 4

友情鏈接更多精彩內(nèi)容