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 からの各結果をパッケージ名に変換してから、それらを除外することです。パッケージがユーザーがインストールしたパッケージである場合、適切な名前が付けられます。それ以外の場合は、null として出力されます。また、まっすぐ進む方法を見つけることができないため、これを回避する必要がありました。

例えば:

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 に答える