android activitymanager只有我的app包被打印出来

时间:2015-10-15 10:21:26

标签: android android-service

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

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.这适用于所有情况,无论我的应用程序是否在前台。

如何从中获得正确的结果?应打印前景中的当前应用程序。

2 个答案:

答案 0 :(得分:0)

由于您正在使用最新版本的Android 5.1.1及更高版本,因此您应该使用App用法,例如解释如下文档。

App usage statistics API允许应用开发者收集与应用程序使用情况相关的统计信息。此API提供了比不推荐使用的getRecentTasks()方法更详细的使用信息。

此示例说明如何使用App usage statistics API,方法是显示按上次使用每个应用程序的时间戳排序的应用程序。

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

要收集应用程序使用情况的统计信息,您需要先通过以下代码获取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()的第一个参数用于聚合统计信息的时间间隔。第二个和第三个参数用于指定要包含在结果中的统计范围的开始和结束

并参考此链接

<强> How to use UsageStatsManager?

另请注意,getRunningAppProcesses不适用于所有设备。

答案 1 :(得分:0)

我使用以下方法解决了:

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;
}