2016-09-26 5 views
0

Ich habe einen Vordergrund-Dienst, der durch Klicken auf ein "X" in der Benachrichtigung beendet werden kann.Ermitteln, ob die App beim Klicken auf eine Benachrichtigung sichtbar ist

Wenn der Vordergrunddienst beendet wird, sollte eine andere Aktivität angezeigt werden.

Das Problem ist, ich weiß nicht, ob die App sichtbar ist oder im Hintergrund, wenn der "X" -Button angeklickt wird. Wenn die App sichtbar ist, sollte die Aktivität geändert werden.

Antwort

0

Check ab ob deine Aktivität im Vordergrund läuft oder nicht? Hier gehen Sie:

public boolean isRunning(Context ctx) { 
    try { 
    ActivityManager am = (ActivityManager) context 
      .getSystemService(Context.ACTIVITY_SERVICE); 
    // The first in the list of RunningTasks is always the foreground 
    // task. 
    RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0); 
    String foregroundTaskPackageName = foregroundTaskInfo.topActivity 
      .getPackageName();// get the top fore ground activity 
    PackageManager pm = context.getPackageManager(); 
    PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(
      foregroundTaskPackageName, 0); 

    String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo 
      .loadLabel(pm).toString(); 

    // Log.e("", foregroundTaskAppName +"----------"+ 
    // foregroundTaskPackageName); 
    if (!foregroundTaskAppName.equals("Your App name")) { 
     return true; 
    } 
} catch (Exception e) { 
    Log.e("isAppSentToBackground", "" + e); 
} 
return false; 
} 

Für API-Ebene> = 21

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
List<ActivityManager.AppTask> tasks = activityManager.getAppTasks(); 

for (ActivityManager.AppTask task : tasks) { 
    Log.d(TAG, "stackId: " + task.getTaskInfo().stackId); 
} 
+0

Wenn, wenn die Aktivität im Hintergrund läuft I 2 Aufgaben sind immer, ein für den Dienst und einen für die Aktivität. Nur wenn die Aktivität vom Betriebssystem getötet wird, gibt es nur eine Aufgabe. – sativa

+0

@sativa: Ja, hier müssen Sie überprüfen, was die erste Aufgabe im Stapel immer im Vordergrund sein wird – Jai

+0

@sativa Dieser Code funktioniert nicht für Andoid API Level> = 21, da die Methode veraltet ist [API Docs Link] (https : //developer.android.com/reference/android/app/ActivityManager.html#getRunningTasks (int)) – harsh201

1

Es gibt keine 100% ige Garantielösung für Ihr Problem.

Eine der einfachsten ist sichtbare Aktivität auf globale Variable zu verfolgen:

public void onResume(){ 
    super.onResume(); 
    App.visibleActivity = this; 
} 

public void onPause(){ 
    super.onPause(); 
    App.visibleActivity = null; 
} 

Aber es gibt einige wichtige Dinge:

1) tun sie nicht vergessen haben, visibleActivity bei onPause um Speicher freizugeben

Leck zu verhindern

2) Es gibt eine Zeitlücke zwischen dem aktuellen onPause und dem nächsten onResume, wenn sich Ihre App technisch im Hintergrund befindet

Verwandte Themen