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

    技术2026-02-15  30

    /** * 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解决!

    Processed: 0.014, SQL: 9