首页 > 解决方案 > 如何获取当前前台活动的包名?

问题描述

我查看了类似的问题,每个答案都有一个共同点,那就是它们不适用于大于 21 的 API。

这个片段只适用于 20 或更低的 API:

ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Activity.ACTIVITY_SERVICE);
String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName();

然后是使用UsageStats的那个。奇怪的是,尽管这是关于 SO 最常发布的答案,但此方法仅适用于一个 API,即 21,即 Android 5.0。它甚至不适用于 Android 5.1。

有没有一种现代的方式有效?谢谢阅读。

标签: javaandroid

解决方案


以下返回当前顶级包的 Observable 的方法可能有效:

    public Observable<String> topPackageNameObservable() {
    return Observable.fromCallable(() -> {
        String topPackageName = "";
        ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
                List<UsageStats> stats =
                        mUsageStatsManager.queryUsageStats(
                                UsageStatsManager.INTERVAL_DAILY,
                                System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1),
                                System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1));
                if (stats != null) {
                    SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
                    for (UsageStats usageStats : stats) {
                        mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
                    }
                    if (!mySortedMap.isEmpty()) {
                        topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
                    }
                } else {
                    topPackageName = mActivityManager.getRunningAppProcesses().get(0).processName;
                }
            } else {
                topPackageName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return topPackageName;
    });

}

推荐阅读