Android M:如何从服务中获取当前前台活动的包名?

5

在Android L中,从ActivityManager服务获取正在运行的任务列表很容易,并且当前活动任务会首先返回。但是在Android M上不再起作用,返回列表仅包含我的应用程序任务。有没有解决方法?

我的代码:

List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = activityManager.getRunningAppProcesses();
for (int i = 0; i < runningAppProcessInfos.size(); i++) {
    ActivityManager.RunningAppProcessInfo runningAppProcessInfo = runningAppProcessInfos.get(i);
    if (runningAppProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
        return runningAppProcessInfo.pkgList[0];
    }
}
2个回答

13

你可以使用下面的代码获取当前前台活动的包名。

   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats");
            long time = System.currentTimeMillis();
            List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
                            time - 1000 * 1000, time);
                    if (appList != null && appList.size() > 0) {
                        SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
                        for (UsageStats usageStats : appList) {
                            mySortedMap.put(usageStats.getLastTimeUsed(),
                                    usageStats);
                        }
                        if (mySortedMap != null && !mySortedMap.isEmpty()) {
                            currentApp = mySortedMap.get(
                                    mySortedMap.lastKey()).getPackageName();
                        }
                    }
        } else {
                ActivityManager am = (ActivityManager) getBaseContext().getSystemService(ACTIVITY_SERVICE);
                currentApp = am.getRunningTasks(1).get(0).topActivity .getPackageName(); 

        }

编辑

在Manifest文件中添加此权限。

<uses-permission android:name="android.permission.GET_TASKS" /> 
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />

注意

请确保您需要在设备中配置自定义设置,以获取您可以使用设置>安全>具有使用访问权限的应用程序来配置它的输出,然后启用您的应用程序权限。


无法在某些设备上运行,这些设备在RunningAppProcessInfo列表中没有任何顺序。因此,tasks.get(0)将始终返回错误的进程。 - JacksOnF1re
尝试这段代码,希望对你有用: ' ActivityManager am = (ActivityManager) getBaseContext().getSystemService(ACTIVITY_SERVICE); currentApp = am.getRunningTasks(1).get(0).topActivity .getPackageName(); ' @JacksOnF1re - Vishal Butani
但是它自从API 21后就被弃用了 :( 问题是,我不能使用UsageStats Manager,因为三星决定不支持它的功能。 - JacksOnF1re
是的,你说得对,这段代码自API 21以来已经被弃用:但是在API 21以下它可以正常工作,所以首先检查API版本并为不同版本添加条件。我也在我的应用程序中使用了上述代码,并且它成功地工作了。谢谢@JacksOnF1re。 - Vishal Butani
到目前为止,谢谢你们的帮助。但是在API 21中我应该怎么做呢?正如所说,UsageStats并不适用于每个设备。 - JacksOnF1re

-1
请在Android M中尝试这些代码行。这对我有效。
String packageName =  ProcessManager.getRunningForegroundApps(getApplicationContext()).get(0).getPackageName();

请查看下方链接以了解其他安卓平台支持。

https://dev59.com/oV4c5IYBdhLWcg3wUI0N#36660429


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接