2012-10-13 7 views
7

Ich erstelle gerade einen Vordergrund-Service mit einer Benachrichtigung, die in der Benachrichtigungsleiste angezeigt wird, wenn der Dienst gestartet wird. Wenn der Dienst beendet wird, wird die Benachrichtigung beendet. Meine Frage ist, gibt es eine Möglichkeit, den Dienst zu stoppen, wenn "alle Benachrichtigungen löschen" oder eine Kündigung der Benachrichtigung (Swipe) auftritt?Wie kann ich einen Vordergrunddienst ablehnen, indem ich die Benachrichtigung verwende (Wischen ablehnen) oder alle Benachrichtigungen lösche?

aktualisiert Umsetzung der Mitteilung enthalten:

public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    Log.d(CLASS, "onStartCommand service started."); 

    if (getString(R.string.service_start_action) == intent.getAction()) 
    { 
     Intent intentForeground = new Intent(this, ServiceMain.class) 
      .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);  
     PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intentForeground, 0);  
     Notification notification; 
     Notification.Builder builder = new Notification.Builder(getApplicationContext()) 
      .setSmallIcon(android.R.drawable.btn_star) 
      .setTicker("Service started...") 
      .setContentIntent(pendIntent) 
      .setDefaults(Notification.DEFAULT_ALL) 
      .setOnlyAlertOnce(true) 
      .setOngoing(false); 
     notification = builder.build(); 
     notification.flags |= Notification.FLAG_FOREGROUND_SERVICE; 

     startForeground(SERV_NOTIFY, notification); 
     player.start(); 
    } 
    else 
    { 
     Log.d(CLASS, "onStartCommand unable to identify acition."); 
    } 

    return START_STICKY;   
} 
+0

Sehen Sie sich dieses Beispiel von Google an: https://github.com/googlesamples/android-ActiveNotifications. Es zeigt, wie Sie auf eine abgewiesene Benachrichtigung sowie auf eine ganze Gruppe von Benachrichtigungen warten. –

+0

Soweit ich weiß, können Sie keinen Vordergrund-Service erstellen, ohne eine Benachrichtigung zu erstellen. Android erfordert dies, da sie nicht möchten, dass Sie Dienste hinter der Szene ausführen, ohne dass der Benutzer es bemerkt. Wenn Sie die Benachrichtigung entfernen, wenn Ihre Aktivität zerstört wurde und Ihr Dienst im Vordergrund ausgeführt wird, können Sie eine Benachrichtigung nicht einfach abbrechen. Das Abbrechen der Benachrichtigung kann nur durch Abbrechen des Vordergrunddienstes selbst über den Aufruf '.stopForeground (true)' erfolgen, der boolesche Parameter gibt an, ob Sie den Vordergrund zusammen mit der Benachrichtigung anhalten möchten. –

Antwort

0

Es ist ein dismissIntent Sie in der Benachrichtigung festlegen können Sie erstellen, obwohl ich Vordergrund Servicebenachrichtigungen dachte nicht gelöscht werden können?

+0

Es gibt eine "Entlassung"? Wo ist diese API-Spezifikation? –

+0

@IgorGanapolsky NotificationCompat.Builder # setDeleteIntent (...) – Dogcat

+0

@Dogcat Ich sehe nicht ** disallIntent ** überall in der API. –

4

Die Benachrichtigung eines vorausschauenden Dienstes kann nicht gelöscht werden. Der einzige Weg ist, den Dienst zu stoppen.

Also ich glaube, das Problem, das Sie lösen wollen, wird nie passieren.

3

Meine Frage ist, gibt es eine Möglichkeit, den Dienst zu stoppen, wenn "alle Benachrichtigungen löschen" oder eine Kündigung der Benachrichtigung (Swipe) auftritt?

Unter der Annahme, dass Ihre Notification ermöglichen eingerichtet wird es gelöscht werden soll the deleteIntent aufgerufen werden, wenn es gelöscht wird. Sie könnten dies auf getBroadcast()PendingIntent setzen und auf ein Manifest-registriertes BroadcastReceiver zeigen, das stopService() aufruft.

+0

danke, dies war mein erster Ansatz, aber sobald die Benachrichtigung des Dienstes in der Benachrichtigungsleiste ist, gibt es keine "alle Benachrichtigungen löschen" -Knopf und die Wischen zum Abweisen Fähigkeit scheint deaktiviert zu sein. –

+0

@moncadad: Bearbeiten Sie Ihre Frage, senden Sie den Code, wo Sie die "Benachrichtigung" erstellen, und kommentieren Sie hier, um mir mitzuteilen, dass Sie es gepostet haben. – CommonsWare

+0

aktualisiert, um die Notification-Implementierung einzuschließen. –

6

Der Benutzer darf keine Benachrichtigung wischen, die von einem fortlaufenden Vordergrund-Dienst generiert wird.

Daher zuerst stopForeground(false), die ermöglicht, dass die Benachrichtigung danach vom Benutzer weggeschwemmt wird (zumindest auf Lollipop +). Für Pre-Lollipop müssen Sie möglicherweise stopForeground(true), die Vordergrund anhält und die Benachrichtigung entfernt, dann erneut die Benachrichtigung mit notificationManager.notify (yourNotificationID, yourNotificationObject), so dass Ihre Benachrichtigung sichtbar, aber swipeable ist.

Legen Sie das Benachrichtigungsobjekt mit einer Löschabsicht fest, die ausgelöst wird, wenn der Benutzer es wegwischt.

(new NotificationCompat.builder(this).setDeleteIntent(deletePendingIntent)).build() 

wo deletePendingIntent so etwas wie

ist
Intent deleteIntent = new Intent(this, YourService.class); 
deleteIntent.putExtra(someKey, someIntValue); 
PendingIntent deletePendingIntent = PendingIntent.getService(this, 
someIntValue, 
deleteIntent, 
PendingIntent.FLAG_CANCEL_CURRENT); 

Wenn der Benutzer es weg klaut, die Absicht mit extra an den Service geliefert. Behandeln Sie das gelieferte Extra innerhalb von onStartCommand, d. H. Prüfen Sie, ob intent != null, intent.getExtras() != null, dann extrahieren Sie den Wert aus dem Extrabündel, gegeben someKey, und wenn es someIntValue entspricht, dann rufen Sie stopSelf().

+0

Ich musste startForeground (false) verwenden, aber ich musste auch den Aufruf von .setOngoing (true) aus meinem NotificationBuilder-Code entfernen – caitoo0o

1

dieser Code funktioniert für mich:

this.stopForeground(false); 
mNotificationManager.cancel(NOTIFY_ID); 

und Sie sollten Ihren Rückgabewert von onStartCommand gesetzt ist, wird STRAT_STICKY Ihren Dienst neu starten.

Verwandte Themen