android activitymanager 只有我的应用程序包被打印

android activitymanager only my app package getting printed

我正在使用后台服务在一段时间后反复检查我的应用程序是否在前台:

private int appForeInterval = 5000; // 5 secs
private Handler seenHandler;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    seenHandler = new Handler();
    appForeChecker.run();
    return Service.START_STICKY;
}

Runnable appForeChecker = new Runnable() {
    @Override
    public void run() {
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningProcInfo = activityManager.getRunningAppProcesses();

        System.out.println(runningProcInfo.size()); // always prints 1

        for(int i = 0; i < runningProcInfo.size(); i++){

            System.out.println(runningProcInfo.get(i).processName); // only prints my package name in any case

            if(runningProcInfo.get(i).processName.equals(my_app_package_name)) {

                System.out.println(runningProcInfo.get(i).lru); // always prints 0 in any case

                if (runningProcInfo.get(i).lru== ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
                    // this is never true 0 != 100
                }
            }
        }

        seenHandler.postDelayed(appForeChecker, appForeInterval);
    }
};

每次,runningProcInfo 大小为 1,即使后台有其他应用程序,即使我的应用程序在后台,也只会打印我的应用程序包名称。 lru 始终为 0。这适用于所有情况,无论我的应用程序是否在前台。

我怎样才能从中得到正确的结果?应打印当前在前台的应用程序。

由于您使用的是 android 5.1.1 及更高版本的最新版本,因此您应该使用 App usage 作为示例说明,阅读下面的文档。

应用程序使用情况统计信息API 允许应用程序开发人员收集与应用程序使用情况相关的统计信息。此 API 提供了比弃用的 getRecentTasks() 方法更详细的使用信息。

此示例说明了如何使用应用程序使用情况统计信息API,方法是显示按每个应用程序上次使用时间戳排序的应用程序。

要使用此 API,您必须首先在清单中声明 android.permission.PACKAGE_USAGE_STATS 权限。用户还必须通过“设置”>“安全”>“具有使用权限的应用”启用此应用的访问权限。

要统计应用的使用情况,需要先通过以下代码获取UsageStatsManager的实例:

mUsageStatsManager = (UsageStatsManager) getActivity()
       .getSystemService(Context.USAGE_STATS_SERVICE);

然后您可以通过以下方法获取应用使用情况的统计数据:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
List<UsageStats> queryUsageStats = mUsageStatsManager
        .queryUsageStats(UsageStatsManager.INTERVAL_DAILY, cal.getTimeInMillis(),
                System.currentTimeMillis());

queryUsageStats() 的第一个参数用于统计数据聚合的时间间隔。第二个和第三个参数用于指定要包含在结果中的统计数据范围的开始和结束

也参考这个link

How to use UsageStatsManager?

另请记住,getRunningAppProcesses 并非适用于所有设备。

我用下面的方法解决了:

private boolean isForeground() {
    boolean isInForeground = false;
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
        List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                for (String activeProcess : processInfo.pkgList) {
                    if (activeProcess.equals(getPackageName())) {
                        isInForeground = true;
                    }
                }
            }
        }
    } else {
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (componentInfo.getPackageName().equals(getPackageName())) {
            isInForeground = true;
        }
    }

    return isInForeground;
}