2016-09-28 4 views
1

Ich versuche, einen Dienst zu entwickeln, dass, wenn ein Benutzer eine App öffnet, mein Dienst es identifizieren wird. Ich verwende die Dateien:/proc/[pid]/cgroup,/proc/[pid]/cmdline,/proc/[pid]/oom_score,/proc/[pid]/oom_score_adj, um zu überprüfen, ob eine Benutzer-App läuft im Vordergrund. Eigentlich funktioniert es, aber wenn ich versuche, ein Spiel zu öffnen, wird der Dienst es nicht immer wieder erkennen. (Der Dienst identifiziert nur die Dateien (oom_score), die den niedrigsten Wert haben).Android, wie bekomme ich App im Vordergrund

Beispiel: oom_score für "com.google.android.googlequicksearchbox: interactor" ist 75, aber für "com.king.candycrushsaga" wird> 150 sein, daher wird es niemals vom Code erkannt (wie folgt) .

Servicecode:

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

Funktion, die die App läuft bekommt:

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

Klasse, die eine Datei liest.

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 veraltet ist, so bitte, es nicht vorschlagen.

Antwort

0

Sie können UsageStatsManager Klasse hinzugefügt in Android API 21 verwenden. Siehe this Frage ausgelöst und beantwortet von me.

Die obige Antwort erhalten Sie eine sortierte Anwendungen Arraylist, erforderlich Vordergrundanwendung in der Arraylist 0

Hope this helfen auf der Index-Nummer wird liefert der erste.

+0

Danke soviel !!!!!! Es hat wirklich funktioniert! –

+0

Ich danke wirklich ** Mr. Gagan Deep **, der mich um 1.30 Uhr wegen dieser Klasse anrief, als ich hoffnungslos war. – lRadha

0

Diese Methoden helfen Ihnen

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 ist veraltet, wie ich schon sagte –

Verwandte Themen