Wie kann ich wissen, ob meine Android-App sichtbar ist?

Ich habe einen Timer, der eine Benachrichtigung startet, wenn er endet. Aber ich möchte eine Benachrichtigung mit notificationManager nur dann auslösen, wenn die App derzeit nicht sichtbar ist und ein alertDialog angezeigt wird, wenn der Timer endet, während die App im Vordergrund steht.

Ich habe schon damit versucht:

ActivityManager actMngr = (ActivityManager) ValeoMobileApplication.getContext().getSystemService(Activity.ACTIVITY_SERVICE); List<RunningAppProcessInfo> runningAppProcesses = actMngr.getRunningAppProcesses(); Tools.log("TimerBroadcastReceiver", "onReceive", "All running processes are listed below :"); for (RunningAppProcessInfo pi : runningAppProcesses) { //Check pi.processName and do your stuff //also check pi importance - check if process is in foreground or background Tools.log("TimerBroadcastReceiver", "onReceive", pi.processName + " importance = "+pi.importance); if(pi.processName.equalsIgnoreCase("MY_APP_PROCESS_NAME")){ if (pi.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { isApplicationInForeground = true; } } } 

Aber es scheint, dass es egal ist, ob die App im Vordergrund steht oder nicht. Wie kann ich das machen?

  • Wie kann ich in BroadcastReceiver wissen, ob App im Vordergrund läuft?
  • Android-Benachrichtigung startet App, möchte aber wieder aufgenommen werden
  • Wie kann ich feststellen, ob ein Android-Service im Vordergrund läuft?
  • START_STICKY, Vordergrund Android Service geht ohne Vorankündigung weg
  • Wie zu erkennen, wann eine Android-App geht in den Hintergrund und kommen wieder in den Vordergrund
  • Wie aktualisiere ich den Benachrichtigungstext für einen Vordergrunddienst in Android?
  • Verbergen Sie die Benachrichtigung über den Vordergrunddienst, während die Aktivität sichtbar ist
  • NotificationManager.cancel () funktioniert nicht für mich
  • 5 Solutions collect form web for “Wie kann ich wissen, ob meine Android-App sichtbar ist?”

    Aber ich möchte eine Benachrichtigung mit notificationManager nur dann auslösen, wenn die App derzeit nicht sichtbar ist und ein alertDialog angezeigt wird, wenn der Timer endet, während die App im Vordergrund steht.

    Verwenden Sie eine bestellte Sendung, wobei die Aktivität einen hochprioren Empfänger hat, wenn er im Vordergrund steht, sowie einen Manifest-registrierten Empfänger für die Fälle, wenn er nicht im Vordergrund steht.

    Hier ist ein Blog-Post , der diese Technik umreißt. Hier ist ein Beispielprojekt, das diese Technik demonstriert.

    Sie können erkennen, ob Ihre App sichtbar ist oder nicht wie folgt:

    In all deiner Activity , Set:

     @Override protected void onResume() { super.onResume(); myVisibilityManager.setIsVisible(true); } @Override protected void onPause() { myVisibilityManager.setIsVisible(false); super.onPause(); } 

    (Dies kann dazu führen, dass Sie eine Superklasse für alle Ihre Aktivitäten definieren, die dieses Verhalten umsetzen würden)

    Dann schaffe einen VisibilityManager (dieser ist sehr einfach, man braucht etwas Fortgeschrittener):

     public class VisibilityManager { private boolean mIsVisible = false; public void setIsVisible(boolean visible) { mIsVisible = visible; } public boolean getIsVisible() { return mIsVisible; } } 

    Und dann, in Ihrem Timer-Thread, wenn der Countdown Null erreicht:

     if (VisibilityManager.getIsVisible()) { showAlertDialog(); } else { showNotification(); } 

    EDIT: aber ich bevorzuge sogar den CommonsWare-Ansatz, der hier auf dieser Seite beschrieben wird. Es ist eleganter.

    Ich würde Ihnen raten, einen Service zu verwenden, anstatt eine Aktivität in diesem Fall.

    Ein Dienst läuft im Hintergrund und wird vom Aktivitätslebenszyklus nicht betroffen, wenn er korrekt gestartet wird.

    Eine wichtige Sache zu erinnern ist, dass, wenn Sie zurück zu der Benutzeroberfläche gehen, muss der Service explizit den UI-Thread anrufen, sonst erhalten Sie ANR-Fehler, da der UI-Thread nicht threadsafe ist.

    Bitte lesen Sie dieses Dokument, es sollte Ihnen helfen, eine bessere Lösung für das, was Sie versuchen zu tun!

    Hoffe das hat geholfen

    Hier ist die Lösung:

     public static boolean uygulamaCalisiyormu(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> islemler = activityManager.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo uygulamaIslemi : islemler) { if (uygulamaIslemi.processName.equals(context.getPackageName())) { if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } } return false; } ... if (uygulamaCalisiyormu(getApplicationContext())) { Log.d("asd","App Already Started"); } else { Log.d("asd","App Started"); } 

    ob

    GetIntent ()

    Rückgabe null Ihre Aktivität steht nicht im Vordergrund.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.