2016-09-28 6 views
1

私はサービスを開発しようとしています。ユーザーが私のサービスでそれを識別するアプリケーションを開くときはいつも。私はファイルを使用しています:/ proc/[pid]/cgroup、/ proc/[pid]/cmdline、/ proc/[pid]/oom_score、/ proc/[pid]/oom_score_adjフォアグラウンドで実際には動作していますが、私が何かゲームを開こうとすると、サービスはそれを常に認識しません。 (サービスは、最も低い値を持つファイル(oom_score)のみを識別します)。Android、フォアグラウンドでアプリを入手する方法

例:「com.google.android.googlequicksearchbox:interactor」のoom_scoreは75ですが、「com.king.candycrushsaga」は150を超えるため、コードでは検出されません(次のように) 。

サービスコード:アプリの実行を取得します

scheduler.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     s=appManager.getAppRunningForeground(); 
     System.out.println(s); 
    } 
},1,2,SECONDS); 

機能:ファイルを読み込み

private ReadWriteFile readWriteFile = new ReadWriteFile(); 
public String getAppRunningForeground(){ 
    int pid; 
    File[] files = new File("/proc").listFiles(); 
    int lowestOomScore = Integer.MAX_VALUE; 
    String foregroundProcess = null; 
    for (File file : files) { 
     if (!file.isDirectory() || (!file.getName().matches(("\\d+")))) 
      continue; 
     pid = Integer.parseInt(file.getName()); 
     try { 
      String cgroup = readWriteFile.read(String.format("/proc/%d/cgroup", pid)); 
      String[] lines = cgroup.split("\n"); 
      if (lines.length != 2) 
       continue; 
      String cpuSubsystem = lines[0]; 
      String cpuaccctSubsystem = lines[1]; 
      if (!cpuaccctSubsystem.endsWith(Integer.toString(pid)) || cpuSubsystem.endsWith("bg_non_interactive")) 
       continue; 
      String cmdline = readWriteFile.read(String.format("/proc/%d/cmdline", pid)); 
      if (cmdline.contains("com.android.systemui")||cmdline.contains("com.google.android.googlequicksearchbox:interactor")) { 
       continue; 
      } 
      int uid = Integer.parseInt(cpuaccctSubsystem.split(":")[2].split("/")[1].replace("uid_", "")); 
      if (uid > 1000 && uid <= 1038)//System process 
       continue; 
      File oomScoreAdj = new File(String.format("/proc/%d/oom_score_adj", pid)); 
      if (oomScoreAdj.canRead()) { 
       int oomAdj = Integer.parseInt(readWriteFile.read(oomScoreAdj.getAbsolutePath())); 
       if (oomAdj != 0) { 
        continue; 
       } 
      } 
      int oomscore = Integer.parseInt(readWriteFile.read(String.format("/proc/%d/oom_score", pid))); 
      if (oomscore < lowestOomScore) { 
       lowestOomScore = oomscore; 
       foregroundProcess = cmdline.replaceAll("\\p{Cntrl}", ""); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return foregroundProcess; 
} 

クラス。

public class ReadWriteFile{ 
    File file; 
    StringBuilder teste3 = new StringBuilder(); 
    FileOutputStream outputStream; 
    public static String read(String path) throws IOException { 
     StringBuilder output = new StringBuilder(); 
     BufferedReader reader = new BufferedReader(new FileReader(path)); 
     output.append(reader.readLine()); 
     for (String line = reader.readLine(); line != null; line = reader.readLine()) 
      output.append('\n').append(line); 
     reader.close(); 
     return output.toString(); 
    } 
} 

P.S:getRunningTasksは推奨されていませんので、ご提案ください。

答えて

0

UsageStatsManagerクラスをandroid api 21に追加することができます。this 質問を提出してmeと回答しました。

上記の答えはあなたにソートされたアプリケーションのArrayListを提供し、必要なフォアグラウンドアプリケーションは、インデックス番号0

希望のArrayListの中に最初のものは、これは役立ちますします。

+0

はどうもありがとうござい役立つ!!!!!!それは本当に働いた! –

+0

**本当にありがとうございます。このクラスについて私が午前1時30分に私に郵送したGagan Deep **は、私が絶望したときに。私が言ったように – lRadha

0

この方法は、あなた

void checkForegroundAppCompat() 
     { 
      ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
      final List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(1); 
      final ComponentName componentName = taskInfo.get(0).topActivity; 
      if(!getWhiteListedPackages().contains(componentName.getPackageName()) && 
        SecurityStatusManager.isAppsBlockingEnabled(this)) 
      { 
       int pid = android.os.Process.getUidForName(componentName.getPackageName()); 
// Kill blick APP here    
    GRLog.w("KILL Blacklist App Package: " + componentName.getPackageName() + " with pid: " + pid); 
       killApp(componentName.getPackageName(), pid); 
      } 
     } 
+0

getRunningTasksは推奨されていません –

関連する問題