监听所有App的前后台活动状态

本文介绍了一种在Android 5.0及以上版本中有效获取当前运行在最前端任务的方法,通过使用UsageStatsManager的queryEvents替代传统的queryUsageStats,解决了无法准确判断应用是否处于桌面状态的问题。

/**
 * Created by xyl 2020/7/4.
 */

class RunningTaskUtil(context: Context) {

    private val TAG = "RunningTaskUtil"
    private lateinit var mUsageStatsManager: UsageStatsManager
    private var topComponentName: ComponentName? = null

    init {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mUsageStatsManager = context.applicationContext
                .getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
        }
    }

    fun getTopRunningTasks(): ComponentName? {
        return getTopRunningTasksByEvent()
    }

    private fun getTopRunningTasksByEvent(): ComponentName? {
        val time = System.currentTimeMillis()
        val usageEvents: UsageEvents =
            mUsageStatsManager.queryEvents(time - 60 * 60 * 1000, time)
        var out: UsageEvents.Event
        val map = TreeMap<Long, UsageEvents.Event>()
        if (usageEvents != null) {
            while (usageEvents.hasNextEvent()) {
                out = UsageEvents.Event() 
                if (usageEvents.getNextEvent(out)) {
                    if (out != null) {
                        map[out.timeStamp] = out
                    } else {
                        Log.e(TAG, " out is NULL")
                    }
                } else {
                    Log.e(TAG, " usageEvents is unavailable")
                }
            }
            if (!map.isEmpty()) {
             
                val keySets = map.navigableKeySet()
                val iterator = keySets.descendingIterator()
                while (iterator.hasNext()) {
                    val event = map[iterator.next()]
                    if (event!!.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
                   
                        topComponentName = ComponentName(event.packageName, "")
                        break
                    }
                }
            }
        } else {
            Log.e(TAG, "null")
        }
        return topComponentName
    }
}

在一个需要获取App是否在前台或桌面状态时,搜索到的几乎千篇一律的是5.0以前的或者是用的queryUsageStats这个方法,导致无法获取是否在桌面的状态,改成queryEvents方法后,BUG解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值