网上找到的获取前台app包名的教程都比较古老了,都是使用UsageStatsManager的queryUsageStats方法
但是该方法在10.0系统上会出现一个问题,当切换到桌面、近期任务列表时,UsageStatsManager.queryUsageStats无法获取到这俩的包名,这就导致我们的app无法知道用户切换到了这俩界面
我在华为p系列、华为mate系列、谷歌pixel3 xl、vivo z6中都遇到了这个问题,它们都搭载了10.0的系统
解决方法是使用UsageStatsManager的queryEvents方法,下面是代码:
import android.app.usage.UsageEvents
import android.app.usage.UsageStatsManager
import android.content.ComponentName
import android.content.Context
import android.os.Build
import android.util.Log
import java.util.*
/**
* Created by hjw on 2020/5/.
*/
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?> = TreeMap()
if (usageEvents != null) {
while (usageEvents.hasNextEvent()) {
out = UsageEvents.Event() //这里一定要初始化,不然getNextEvent会报空指针
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()) {
//将keyset颠倒过来,让最近的排列在上面
val keySets = map.navigableKeySet()
val iterator: Iterator<*> = keySets.descendingIterator()
while (iterator.hasNext()) {
val event = map[iterator.next()]
if (event!!.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND) {
//当遇到有app移动到前台时,就更新topComponentName
topComponentName = ComponentName(event.packageName, "")
break
}
}
}
} else {
Log.e(TAG, " usageEvents is null")
}
return topComponentName
}
}
使用的时候:
var componentName = getTaskUtil.getTopRunningTasks()
if (componentName != null) {
Log.d(TAG, "" + componentName.packageName)
}