2013-02-26 21 views
6

Ich habe eine Anwendung, die Sound-Pool beteiligt - Beim Start der Anwendung werden alle Sounds geladen, nach denen Hauptbildschirm geladen wird.Überprüfen Sie, ob meine App in Android läuft

Jetzt möchte ich überprüfen, ob die Anwendung ausgeführt wird - wenn nicht ausgeführt wird, möchte ich die Anwendung neu laden - wenn es ausgeführt wird, möchte ich nicht die Anwendung neu laden.

Für welche habe ich versucht, die folgenden:

ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses(); 
for(int i = 0; i < procInfos.size(); i++){ 
    if(procInfos.get(i).processName.equals("com.me.checkprocess")) 
    { 
    Log.e("Result", "App is running - Doesn't need to reload"); 
    } 
    else 
    { 
    Log.e("Result", "App is not running - Needs to reload); 
    } 
} 

Diese Ergebnisse gibt perfekt aus, sondern hält bei der Kontrolle bis procInfos.size weniger ist, dass 0. Bis zur App Prozess com.me.checkprocess wahr wird - es ist immer falsch? so kommt es immer zuerst in den anderen Teil.

Also zum Beispiel: Wenn der Gesamtprozess 30 ist. Und mein Prozess com.me.checkprozess läuft @ 29.. Wenn die Bedingung ausgeführt wird. Bis 28. Prozess ist es anders und @ 29. Prozess wird es in den Zustand wahr.

Wie man dieses Teil repariert - ich möchte nur zu einem anderen Teil gelangen, nachdem der Gesamtprozess überprüft wurde?

Lassen Sie mich wissen!

+2

Verwenden 'brechen;' Aussage. –

+0

'Missing Zitat' am Ende dieser Zeile 'Log.e (" Ergebnis "," App läuft nicht - muss neu laden); ' –

Antwort

7

Ich denke, man kann nur

break; 

unter

Log.e("Result", "App is running - Doesn't need to reload"); 

in if Aussage

3

einfach eine Pause in der for-Schleife setzen hinzuzufügen.

for(...){ 
    if(){ 
     break; 
    } 
} 

Dies ist definitiv nicht sauber, aber tut das, was Sie wollen.

** EDIT 2

ich denke, es wäre einfacher, wenn Sie nur diese Aufgabe bei einem Verfahren extrahieren.

public boolean isProcessRunning(String process) { 
    ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
    List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses(); 
    for(int i = 0; i < procInfos.size(); i++){ 
     if (procInfos.get(i).processName.equals(process)) { 
      return true; 
     } 
    } 
    return false; 
} 

public static void main(String[] args) { 
    if (isProcessRunning("my_process")) { 
     // Do what you need 
    } else { 
     // restart your app 
    } 
} 
+0

Dann was ist der sauberere Weg? –

+0

@HarryJoy" sauber "ist subjektiv. Ich würde bevorzuge den Bruch über eine komplizierte Beendigungsbedingung oder eine Konstruktion mit einer booleschen Variable – Henry

+0

@Henry yeah Ich habe deinen Punkt, aber tatsächlich fragte ich ehrlich, ob * c4pone * auch einen saubereren Weg hat, dies zu tun, dann zu brechen. –

2

Dies ist, was Sie tun sollten.

if(procInfos.get(i).processName.equals("com.me.checkprocess")) 
    { 
    Log.e("Result", "App is running - Doesn't need to reload"); 
    break; 
    } 
2

Die anderen aufgeführten Antworten funktionieren werden, aber ich stimme c4pone mit - in einer Schleife, wie dies scheint Pause wie ein schlechter Weg, es zu tun - vor allem als ein break mit bedeutet, dass, wenn Sie eine weitere Bedingung hinzufügen, um Ihre if-Anweisung, gibt es eine Chance, dass die break kann nicht mehr funktioniert die for Schleife verlass - in gewisser Weise ist es zu einer goto Aussage in anderen Sprachen

eine weitere Alternative, um Ihr Problem analog ist, ist dies:

for(int i = 0; i < procInfos.size(); i++){ 
    if(procInfos.get(i).processName.equals("com.me.checkprocess")) 
    { 
     Log.e("Result", "App is running - Doesn't need to reload"); 
     i = procInfos.size(); 
    } 
    else 
    { 
     Log.e("Result", "App is not running - Needs to reload); 
    } 
} 

Das wird auch die Schleife unterbrechen, da es Ihre Counter-Variable auf die Beendigungsklausel setzt, was bedeutet, sobald sie gefunden wird, wird die Schleife beendet.

EDIT:

unten Nach Kommentar des OP, habe ich das Gefühl, dass die Lösung, die er will, ist dies:

boolean found = false; 
for(int i = 0; i < procInfos.size(); i++){ 
    if(procInfos.get(i).processName.equals("com.me.checkprocess")) 
    { 
     found = true; 
    } 
} 

if(found) 
{ 
    Log.e("Result", "App is running - Doesn't need to reload"); 
    i = procInfos.size(); 
} 
else 
{ 
    Log.e("Result", "App is not running - Needs to reload); 
} 

, die nichts mit dem Verlassen der Schleife vorzeitig, da alle zu tun ist, von uns gedacht, aus dem Lesen der Frage, ist aber stattdessen nur das Ergebnis einmal ausgeben

+0

Again. Das geht direkt an den anderen Teil und geht dann an wenn Teil. Also zum Beispiel, wenn der Gesamtprozess 30 ist und "com.me.checkprocess" am 29. - 28. läuft, wird die App zum anderen Teil gehen ("muss neu geladen werden") und dann wird @ 29 sagen, dass sie wahr ist. t müssen neu geladen werden. – TheDevMan

+0

Natürlich wird es. An dieser Stelle vermute ich, dass Sie Ihre ursprüngliche Frage überhaupt nicht gut formuliert haben. Soll die else-Klausel nur einmal ausgeführt werden? Wenn ja, habe ich meine Antwort bearbeitet, um Ihnen eine Lösung zu geben –

+0

Ja. Der Zustand ist so. Entschuldigung für falsche Kommunikation. Ich habe die Frage auch richtig bearbeitet. sonst Teil sollte nur auftreten, wenn der Prozess nicht da ist. Nicht jedes Mal, wenn es in den Prozess geht. Mein Code oder Ihr Code geht immer an sonst Teil geht dann wenn Teil. – TheDevMan

0
public static boolean isAppRunning(Context context) { 

// Überprüfen Sie mit der ersten Aufgabe (Aufgabe im Vordergrund) // in der zurückgegebenen Liste der Aufgaben

ActivityManager activityManager = (ActivityManager) 
context.getSystemService(Context.ACTIVITY_SERVICE); 
List<RunningTaskInfo> services = 
activityManager.getRunningTasks(Integer.MAX_VALUE); 
if 
(services.get(0).topActivity.getPackageName().toString().equalsIgnoreCase(context.getPackageName().toString())) 
{ 
return true; 
} 
return false; 
} 
Verwandte Themen