Kotlin--›Android 一行代码监听程序APP切换至后台(判断程序是否在后台运行)

2023-05-16

其实主要就是通过ApplicationActivityLifecycleCallbacks回调, 判断当前所有Activity的生命周期.

整个核心代码如下:

object RBackground {

    const val CREATE = "onActivityCreated"
    const val STARTED = "onActivityStarted"
    const val RESUMED = "onActivityResumed"
    const val PAUSED = "onActivityPaused"
    const val STOPPED = "onActivityStopped"
    const val SAVE = "onActivitySaveInstanceState"

    /** class_name|state */
    val stack = SparseArray<String>()

    private val observers = mutableListOf<OnBackgroundObserver>()

    /**主线程回调*/
    val lifecycleCallbacks = object : Application.ActivityLifecycleCallbacks {

        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            pushItem(activity.hashCode(), activity.javaClass.name, CREATE)
        }

        override fun onActivityStarted(activity: Activity) {
            changeItem(activity.hashCode(), activity.javaClass.name, STARTED)
        }

        override fun onActivityResumed(activity: Activity) {
            changeItem(activity.hashCode(), activity.javaClass.name, RESUMED)
        }

        override fun onActivityPaused(activity: Activity) {
            if (activity.isFinishing) {
            } else {
                changeItem(activity.hashCode(), activity.javaClass.name, PAUSED)
            }
        }

        override fun onActivityStopped(activity: Activity) {
            if (activity.isFinishing) {
            } else {
                changeItem(activity.hashCode(), activity.javaClass.name, STOPPED)
            }
        }

        override fun onActivityDestroyed(activity: Activity) {
            removeItem(activity.hashCode(), activity.javaClass.name)
        }

        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
            changeItem(activity.hashCode(), activity.javaClass.name, SAVE)
        }
    }

    private fun pushItem(code: Int, className: String, state: String) {
        val item = "$className|$state"

        stack.put(code, item)

        observers.forEach {
            it.onActivityChanged(stack, isBackground())
        }
    }

    private fun changeItem(code: Int, className: String, state: String) {
        pushItem(code, className, state)
    }

    private fun removeItem(code: Int, className: String) {
        stack.remove(code)

        observers.forEach {
            it.onActivityChanged(stack, isBackground())
        }
    }

    fun init(application: Application, observer: OnBackgroundObserver? = null) {
        application.registerActivityLifecycleCallbacks(lifecycleCallbacks)

        observer?.let {
            registerObserver(it)
        }
    }

    fun isBackground(): Boolean {
        var result = stack.size() != 0

        for (i in 0 until stack.size()) {
            val value = stack.get(stack.keyAt(i))
            if (value.endsWith(STOPPED)) {

            } else {
                result = false
                break
            }
        }

        return result
    }

    fun registerObserver(observer: OnBackgroundObserver) {
        if (!observers.contains(observer)) {
            observers.add(observer)
        }
    }

    fun unregisterObserver(observer: OnBackgroundObserver) {
        observers.remove(observer)
    }
}

interface OnBackgroundObserver {
    fun onActivityChanged(stack: SparseArray<String>, background: Boolean)
}

使用方法:

RBackground.init(this, object : OnBackgroundObserver {
            override fun onActivityChanged(stack: SparseArray<String>, background: Boolean) {
                L.d("$stack")
                if (background) {
                    //切换到后台
                        Tip.tip("您已切换至后台")
                }
            }
        })

群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此快速加群

请使用QQ扫码加群, 小伙伴们都在等着你哦!

关注我的公众号, 每天都能一起玩耍哦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin--›Android 一行代码监听程序APP切换至后台(判断程序是否在后台运行) 的相关文章

  • #VMware#ESXI 修改主机的控制台HTTP/HTTPS端口

    目录 一 开启SSH服务 二 修改控制台的默认端口 1 关闭防火墙的情境下 xff1a 1 1 远程进入ESXI的后台 xff0c 修改HTTP端口配置文件 1 2 关闭ESXI防火墙 1 3 重启服务器 2 不关闭防火墙的情景下 xff1
  • #ESXI #Centos 业务服务器故障如何恢复盘

    一 环境描述 有一台centos7的业务服务器 xff0c 因为操作人员重大失误 xff0c 导致业务服务器宕机 xff0c 由于未做备份与快照 xff0c 无法进行恢复 xff0c 考虑通过将硬盘挂载在其他虚拟机上重新获取数据 设备环境为
  • pikachu 靶场搭建

    一 准备环境 1 搭建环境 win 10phpstudypikachu 2 下载链接 win10自行寻找资源 pickchu靶机下载地址 xff1a https github com zhuifengshaonianhanlu pikach
  • virtualbox命令行启动虚拟机和关闭虚拟机和虚拟机关闭防火墙

    查看virtualbox正在运行的虚拟机命令 VBoxManage list runningvms 根据查到的虚拟机 ip 号 使用后台命令启动虚拟机的方法 xff1a VBoxManage startvm ip 使用后台命令关闭虚拟机的方
  • android studio 最新3.0 kotlin与databinding 结合使用报错。

    最近android studio 3 0更新 xff0c 迫不及待将项目中的代码向kotlin转 其中转到有databinding的时候遇到报错 xff1a Unresolved reference databinding 找到网上解决办法
  • AS--›Android Studio内存大小设置和插件推荐(2021-1-14更新)

    调整AS的占用内存 多开工程毫无压力 AS 3 5 的版本 已经支持通过设置界面修改内存大小了 但是 旧方法依旧有效 文章目录 Windows修改方法MAC修改方法插件推荐 ignore A Search with GithubTransl
  • android Camera预览界面拉伸问题解决

    问题现象 项目中的扫一扫界面打开以后 xff0c 扫描二维码的界面显示的二维码被拉伸 xff0c 图片如下 xff1a 问题原因 通常 xff0c 拍照预览页面的视图拉伸主要与下面两个因素有关 xff1a Surfaceview的大小Cam
  • 什么是 AOP,AOP 的作用是什么?

    分析 amp 回答 AOP的介绍 AOP全称 xff08 Aspect Oriented Programming xff09 面向切片编程的简称 AOP面向方面编程基于IoC xff0c 是对OOP的有益补充 xff1b AOP利用一种称为
  • Ubuntu图形界面卡死的解决方法

    转到字符界面 xff1a Ctrl 43 Alt 43 F1 查看进程 xff1a ps t tty7 找到Xorg进程的PID号xxx xff0c 如992 杀死进程Xorg xff1a kill xxx xff08 这里是kill 99
  • 笔记本电脑电源指示灯亮但是黑屏开不了机(或者成功开机之后发现很卡顿)的解决方法

    问题描述 本人电脑是联想拯救者Y7000P xff0c 性能如下 近期遇到一个问题 xff0c 笔记本电脑开机的之后 xff0c 突然出现卡顿 xff0c 不管是打开浏览器还是打开软件 xff0c 都要等上几秒钟 xff0c 连刷新都要等一
  • windows下的WSL开发环境配置以及相关工具、插件

    最近在自己的X1上捣鼓Django框架的编程 xff0c windows环境使用起来确实让人痛苦 xff0c 因此决定还是在Linux系统下进行Django框架的编程 xff0c 跟朋友交流了一下 xff0c 最终敲定了以下方案并把中间使用
  • 最全spring框架工作流程

    Spring执行流程 xff1a 用户发起请求到前端控制器 xff08 DispatcherServlet xff09 xff0c 该控制器会过滤出哪些请求可以访问Servlet 哪些不能访问 就是url pattern的作用 xff0c
  • python多线程爬虫教学,清晰易懂。

    首先需要知道什么是多线程 xff0c 多线程的作用 首先举个例子 xff0c 并发和并行 xff1a 并发 xff1a 并发 xff0c 在操作系统中 xff0c 是指一个时间段中有几个程序都处于已启动运行到运行完毕之间 xff0c 且这几
  • ubuntu 下ethtool安装

    1 xff0c 下载安装包 xff1a ethtool 2 6 37 tar xff0c 将其放入自己的路径下 xff0c 解压 xff1a tar xvf ethtool 2 6 37 tar 2 cd ethtool 2 6 37 执行
  • 第四章_表达式_4.9 sizeof 运算符

    4 9 sizeof 运算符 4 9 sizeof 运算符 4 9 sizeof 运算符 sizeof运算符返回一条表达式或一个类型名字所占的字节数 sizeof运算符满足右结合律 xff0c 其所得的值是一个size t类型的常量表达式
  • 初探ViewBinding

    视图访问的方式有常用的findViewById xff0c ButterKnife等多种方式 xff0c 这些方式的各方面对比如下 如上图所示 xff0c 在简明 编译安全和编译速度上都各有优势 xff0c 那么有没有一种方式可以一石 34
  • Kotlin--›Android 超轻,超好用,超简洁,超超超级RecyclerView分割线ItemDecoration封装

    需求分析 如图所示的 101 共2人 这一行 顶部有 一块白色区域 可以当做是分割线101 共2人 这一行 底部有一个很细的分割线 差不多撑满了一行人物信息 这一行 首次出现时 只有底部有分割线 而且还是 非撑满一行的效果人物信息 这一行
  • Linux系统网络配置详解

    1 当一台Linux虚拟机刚创建完成是无法上网 xff0c 所以需要我们去配置网络 2 右击虚拟界面 xff0c 点击打开终端 3 查看虚拟机的网关 xff08 1 xff09 点击VMware Workstation左上角的编辑 xff0
  • Linux的sed命令详解大全

    Linux的sed命令详解大全 一 sed命令介绍二 sed 的运行模式三 sed的相关选项四 sed基本用法1 sed语法2 sed的查看功能 查看passwd文件的第5到第8行内容 查看passwd文件中以roo开头的行 忽略大小写 x
  • Linux下shell脚本之双色球摇号脚本

    Linux下shell脚本之双色球摇号脚本 一 脚本要求二 脚本内容三 运行脚本 一 脚本要求 二 脚本内容 三 运行脚本 一 脚本要求 1 编写脚本Lottery sh 模拟摇号过程 2 6位数红色球随机生成 xff0c 不能重复 xff

随机推荐