1

下面是我运行的代码以获取在 Android 设备上运行的进程。但问题是我把它和所有的系统进程一起搞定了。有没有办法分离系统服务(或)我可以更改函数调用,这样我就不会完全获得系统服务。

   @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public List<UsageStats> getUsageStats() {
            UsageStatsManager mUsageStatsManager = (UsageStatsManager) getActivity()
                    .getSystemService(Context.USAGE_STATS_SERVICE);
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.HOUR_OF_DAY,0);
            cal.set(Calendar.MINUTE,1);
            List<UsageStats> queryUsageStats = mUsageStatsManager
                    .queryUsageStats(UsageStatsManager.INTERVAL_BEST, cal.getTimeInMillis(),
                            System.currentTimeMillis());

                       return queryUsageStats;
        }
4

1 回答 1

0

我所做的是将 queryusageStats 中的每个结果转换为包名称,然后将它们过滤掉。如果包是用户安装的包,那么它将有一个正确的名称,否则它将被打印为空。我也找不到任何直截了当的方法,所以不得不解决这个问题。

例如:

private String getAppNameFromPackage(String packageName, Context context) {
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> pkgAppsList = context.getPackageManager()
            .queryIntentActivities(mainIntent, 0);

    for (ResolveInfo app : pkgAppsList) {
        if (app.activityInfo.packageName.equals(packageName)) {
            return app.activityInfo.loadLabel(context.getPackageManager()).toString();
        }
    }
    return null;
}

for (UsageStats u : queryUsageStats){

   String package_name = getAppNameFromPackage(u.getPackageName(), context);

   if(package_name.equals(null){

       Log.d(TAG, "Pkg:" + package_name + " is an system package/service");

   }else

       Log.d(TAG, "Pkg: " + package_name +  "\t" + "ForegroundTime: "
        + u.getTotalTimeInForeground() + " milliseconds") ;
}
于 2017-07-04T07:10:43.283 回答