android10.0获取前台app的包名

网上找到的获取前台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)

}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值