监听activity从后台切换到前台

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

    companion object {
        // 正常状态
        const val STATE_NORMAL = 0

        // 从后台回到前台
        const val STATE_BACK_TO_FRONT = 1

        // 从前台进入后台
        const val STATE_FRONT_TO_BACK = 2

        //最大时间 10秒
        const val MAX_TIME = 1 * 1000

    }

    // APP状态
    private var sAppState: Int = STATE_NORMAL

    // 标记程序是否已进入后台(依据onStop回调)
    private var flag = false

    // 标记程序是否已进入后台(依据onTrimMemory回调)
    private var background = false

    // 从前台进入后台的时间
    private var frontToBackTime: Long = 0

    // 从后台返回前台的时间
    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) {
        //判断当前activity是否处于前台
        if (!AppUtil.isRunningForeground(this)) {
            // 从前台进入后台
            sAppState = STATE_FRONT_TO_BACK
            frontToBackTime = System.currentTimeMillis()
            flag = true
        } else {
            // 否则是正常状态
            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不可见的回调, 通常程序进入后台后都会触发此回调,大部分手机多是回调这个参数
        // TRIM_MEMORY_BACKGROUND也是程序进入后台的回调, 不同厂商不太一样, 魅族手机就是回调这个参数
        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
        }
    }

    /**
     * 进入后台间隔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
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 4,748评论 0 6
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 1,041评论 1 2
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 1,402评论 0 0
  • 跟随樊老师和伙伴们一起学习心理知识提升自已,已经有三个月有余了,这一段时间因为天气的原因休课,顺便整理一下之前学习...
    学习思考行动阅读 889评论 0 2
  • 一脸愤怒的她躺在了床上,好几次甩开了他抱过来的双手,到最后还坚决的翻了个身,只留给他一个冷漠的背影。 多次尝试抱她...
    海边的蓝兔子阅读 927评论 1 4

友情链接更多精彩内容