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

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

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

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

RunningTasks方式

注意:getRunningTask方法在5.0以上已经被废弃,只能返回自己和系统的一些不敏感的task,不再返回其他应用的task,用此方法来判断自身App是否处于后台是有效的,但是无法判断其他应用是否处于前台。Nj528资讯网——每日最新资讯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的进程就可以判断为前台。Nj528资讯网——每日最新资讯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中进行注册:Nj528资讯网——每日最新资讯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是前台还是后台。Nj528资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • 小米MIX Fold 3下月亮相:今年唯一无短板的全能折叠屏

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都有新的进展,其中荣耀、三星都已陆续发布了最新的折叠屏旗舰,尤其号荣耀Magi
  • iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top