2016-12-19 3 views
0

以下は、Androidデバイスで実行されていたプロセスを取得するためのコードです。しかし、キャッチは、私はすべてのシステムプロセスと一緒にそれを得ることです。システムサービスを分離する方法はありますか(または)関数呼び出しを変更して、システムサービスを完全に取得しないようにすることはできますか?AndroidのUsageStatsManagerクラスのqueryUsageStats()によって返されたリストとシステムサービスを区別する方法

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

答えて

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") ; 
} 
関連する問題