当前位置:首页 > 科技  > 软件

如何判断APP在前台还是后台?

来源: 责编: 时间:2024-01-22 08:40:56 314观看
导读如何判断一个APP在前台还是后台?可以通过RunningTasks,RunningProcess 以及ActivityLifecycleCallback判定。RunningTasks方式注意:getRunningTask方法在5.0以上已经被废弃,只能返回自己和系统的一些不敏感的task,不再返回

如何判断一个APP在前台还是后台?可以通过RunningTasks,RunningProcess 以及ActivityLifecycleCallback判定。O7528资讯网——每日最新资讯28at.com

RunningTasks方式

注意:getRunningTask方法在5.0以上已经被废弃,只能返回自己和系统的一些不敏感的task,不再返回其他应用的task,用此方法来判断自身App是否处于后台是有效的,但是无法判断其他应用是否处于前台。O7528资讯网——每日最新资讯28at.com

private fun getTopApplication() {    //首先获取到ActivityManager    val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager    if (activityManager.getRunningTasks(1) == null){        Log.e(TAG, "getForegroundActivity: ")        return    }    var runningTaskInfo = activityManager.getRunningTasks(1)[0]    if (runningTaskInfo == null) {        Log.e(TAG, "runningTaskInfo is null")        return    }    runningTaskInfo.topActivity?.let {        Log.e(TAG, "top application is ${it.packageName}")    }}

RunningProcess方式

注意:RunningProcess方法在5.0以上已经被废弃,例如,在聊天类型的App中,大部分时间需要常驻后台来不间断地获取服务器的消息,就必须把Service设置成START_STICKY,kill后会被重启(等待5s左右)来保证Service常驻后台。如果Service设置了这个属性,这个App的进程就可以判断为前台。O7528资讯网——每日最新资讯28at.com

appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
private fun isAppForeground(): Boolean {    val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager    var runningAppProcesses = activityManager.runningAppProcesses    if (runningAppProcesses == null) {        Log.e(TAG, "runningAppProcesses is null")        return false    }    runningAppProcesses.forEach {        if (it.processName == packageName && (it.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)) {            return true        }    }    return false}

ActivityLifecycleCallbacks方式

class MyActivityLifecycleCallbacks(    var onActivityCreatedAction: ((Activity, Bundle?) -> Unit)? = null,    var onActivityStartedAction: ((Activity) -> Unit)? = null,    var onActivityResumedAction: ((Activity) -> Unit)? = null,    var onActivityPausedAction: ((Activity) -> Unit)? = null,    var onActivityStoppedAction: ((Activity) -> Unit)? = null,    var onActivitySaveInstanceStateAction: ((Activity, Bundle) -> Unit)? = null,    var onActivityDestroyedAction: ((Activity) -> Unit)? = null) : Application.ActivityLifecycleCallbacks {    private var mCount=0    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {        onActivityCreatedAction?.invoke(activity, savedInstanceState)    }    override fun onActivityStarted(activity: Activity) {        mCount++        onActivityStartedAction?.invoke(activity)    }    override fun onActivityResumed(activity: Activity) {        onActivityResumedAction?.invoke(activity)    }    override fun onActivityPaused(activity: Activity) {        onActivityPausedAction?.invoke(activity)    }    override fun onActivityStopped(activity: Activity) {        mCount--        onActivityStoppedAction?.invoke(activity)    }    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {        onActivitySaveInstanceStateAction?.invoke(activity, outState)    }    override fun onActivityDestroyed(activity: Activity) {        onActivityDestroyedAction?.invoke(activity)    }    /**     * 这里我们把mCount的实际数值返回回去     */    fun getCount():Int = mCount}

这里我们对ActivityLifecycleCallbacks的实现类做了一层封装,利用Kotlin的高阶函数,当我们需要去实现那个声明周期的回调的时候,就通过高阶函数来提供回调处理,否则默认不做任何处理。然后我们在Application的onCreate中进行注册:O7528资讯网——每日最新资讯28at.com

class LifeApplication : Application() {    private val TAG = "LifeApplication"    private val mActivityLifecycleCallbacks by lazy {        MyActivityLifecycleCallbacks(            onActivityCreatedAction = { activit, bundle ->            Log.e(TAG, "onCreate: ")        },        onActivityStoppedAction = { activity ->            Log.e(TAG, "onStop ")        },        onActivityDestroyedAction = { activity ->            Log.e(TAG, "onDestroy")        })    }    override fun onCreate() {        super.onCreate()        instance = this        //注册生命周期回调事件        registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks)    }    /**     * 用于判断当前进程是否处于前台     */    fun isForegroundMethod(): Boolean = mActivityLifecycleCallbacks.getCount() > 0    companion object{        private var instance :LifeApplication?= null        fun getInstance () = instance!!    }

当我们不管是点击Back键还是Home键都会回调到onStop方法,我们在onStart和onStop中分别对mCount值做了加减,这样我们可以通过该数值来判断当前App是前台还是后台。O7528资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-65868-0.html如何判断APP在前台还是后台?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 实现定时任务的六种策略

下一篇: Python编程新手须知:避免代码陷阱的秘诀

标签:
  • 热门焦点
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾“低价”口号。而过去与他们错位竞争的拼多多,靠
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top