2014-02-27 6 views
11

Ist es eine Möglichkeit, einen Dienst als Vordergrunddienst zu starten und die Benachrichtigung auszublenden, während eine Aktivität sichtbar ist?Benachrichtigung über Vordergrunddienst ausblenden, während Aktivität sichtbar ist

Betrachten Sie einen Musik-Player, während die App geöffnet ist, benötigen Sie nicht die Benachrichtigung (mit den Tasten), aber wenn der Musik-Player im Hintergrund ist, sollte die Benachrichtigung angezeigt werden.

Ich weiß, wie dies zu tun ist, wenn ich nicht meinen Dienst im Vordergrund ausführen ... Aber wenn im Vordergrund läuft, benötigt der Dienst selbst die Benachrichtigung und zeigt es an und ich kann die Benachrichtigung nicht selbst verwalten ...

Wie kann ich dieses Problem lösen?

Antwort

10

Sie können es so machen. Eine Voraussetzung für diese Methode ist, dass Ihre Aktivität den Dienst binden muss.

Zuerst starten Sie den Dienst Vordergrund.

private Notification mNotification; 

public void onCreate() { 
    ... 
    startForeground(1, mNotification); 
} 

Dann binden und lösen Sie in Ihrer Aktivität den Dienst wie unten gezeigt. BIND_ADJUST_WITH_ACTIVITY ist wichtig, um den Dienst für die Zeit aufrecht zu erhalten, in der er an sichtbare Aktivitäten gebunden ist.

public void onStart() { 
    ... 
    Intent intent = new Intent(this, PlayerService.class); 
    bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY); 
} 

public void onStop() { 
    ... 
    unbindService(mConnection); 
} 

Jetzt ist hier die letzte Vergangenheit. Sie beenden den Vordergrund, wenn mindestens ein Client mit dem Dienst verbunden ist, und Sie starten den Vordergrund, wenn der letzte Client die Verbindung trennt.

@Override 
public void onRebind(Intent intent) { 
    stopForeground(true); // <- remove notification 
} 

@Override 
public IBinder onBind(Intent intent) { 
    stopForeground(true); // <- remove notification 
    return mBinder; 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    startForeground(1, mNotification); // <- show notification again 
    return true; // <- important to trigger future onRebind() 
} 

Wenn eine Dienstbindung, müssen Sie Regeln von Android angewendet betrachten. Wenn Sie einen nicht gestarteten Dienst binden, wird der Dienst nicht automatisch gestartet, es sei denn, Sie geben BIND_AUTO_CREATE zusätzlich zum Flag BIND_ADJUST_WITH_ACTIVITY an.

Wenn der Dienst mit automatischem Erstellungs-Flag gestartet wurde und der letzte Client die Verbindung aufhebt, wird der Dienst automatisch beendet. Wenn Sie den Dienst am Laufen halten möchten, müssen Sie ihn mit der Methode startService() starten. Grundsätzlich sieht Ihr Code wie der folgende aus.

Intent intent = new Intent(this, PlayerService.class); 
    startService(intent); 
    bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY); 

startService() Aufruf für bereits begonnen Dienst hat keine Wirkung auf sie, da wir nicht onCommand() Methode außer Kraft setzen.

+0

scheint zu tun, was ich will ... nur ein Nachteil, ich muss den Dienst starten, bevor ich es tatsächlich brauche ... – prom85

+0

Just beendete die Implementierung. Es sollte gut funktionieren. Die Antwort wurde aktualisiert. –

+0

Ich habe es vorher versucht, hat nicht perfekt funktioniert ... Ich werde die Änderungen überprüfen und es nochmal anschauen ...Übrigens würde es nicht funktionieren, den Dienst nicht zu binden und eine Absicht in den Aktivitäten onPause/onResume zu senden, um den Vordergrundzustand des Dienstes zu ändern, weil der Dienst möglicherweise getötet wird, während die Aktivität aktiv ist? Kann das wirklich passieren? Oder würde das auch funktionieren? – prom85

2

Verwendung folgende Schritte:

1.Verwenden Activity aktuelle Paketnamen (das heißt die Aktivität Lauf oben) zu erhalten.

2.check, wenn seine Anwendung dann nicht zeigen die Meldungen

3.else Wenn es nicht Ihre Anwendung zeigen dann die Meldungen.

ActivityManager manager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
          List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1); 
          String topActivityName = tasks.get(0).topActivity.getPackageName(); 
          if(!(topActivityName.equalsIgnoreCase("your package name"))){ 
//enter notification code here 
}