2016-06-17 5 views
6

Ich habe eine App, die zwei Dienste hat.Einzelmeldung für mehrere Vordergrunddienste mit StartForeground() Anruf

Eine ist zum Anzeigen der Benutzeroberfläche für Floating (Overlay) auf andere Anwendungen mit WindowManager. Die andere ist für die Standortverfolgung unter Verwendung GooglePlayAPI. Meine App führt diese Dienste immer aus.

Ich möchte diese Dienste nicht vom Betriebssystem getötet werden. Also rufe ich Service.startForeground() an. In der Benachrichtigungsleiste befinden sich jedoch zwei Benachrichtigungen.

Gibt es eine Möglichkeit, eine einzelne Benachrichtigung für beide Dienste zu verwenden?

+0

Zwei Benachrichtigungen in Android bedeutet? –

+0

@ Pramod, wenn startForeground-Methode in Service verwenden, setzt Android-System Benachrichtigung über Service, der jetzt ausgeführt wird. Ich benutze zwei Dienste. und verwenden Sie die startForeground-Methode in beiden Klassen. –

+0

Eine Option besteht darin, die 2 Dienste in einem einzigen Dienst zu konsolidieren. Ich weiß, dass dies die Frage nicht beantwortet. Aber es kann eine Option für Sie sein, wenn beide Dienste zusammen starten und stoppen. – Madushan

Antwort

10

Ja, es ist möglich.

Wenn wir uns die Service.startForeground() -Signatur ansehen, akzeptiert sie beide Benachrichtigungs-ID & die Benachrichtigung selbst (see documentation). Wenn wir also nur eine einzige Benachrichtigung für mehr als einen Vordergrund-Dienst haben möchten, müssen diese Dienste die gleiche Benachrichtigungs-ID & teilen.

Wir können Singleton-Muster verwenden, um die gleiche Benachrichtigung zu erhalten & Benachrichtigungs-ID. Hier ist die Beispiel-Implementierung:

NotificationCreator.java

public class NotificationCreator { 

    private static final int NOTIFICATION_ID = 1094; 

    private static Notification notification; 

    public static Notification getNotification(Context context) { 

     if(notification == null) { 

      notification = new NotificationCompat.Builder(context) 
        .setContentTitle("Try Foreground Service") 
        .setContentText("Yuhu..., I'm trying foreground service") 
        .setSmallIcon(R.mipmap.ic_launcher) 
        .build(); 
     } 

     return notification; 
    } 

    public static int getNotificationId() { 
     return NOTIFICATION_ID; 
    } 
} 

So haben wir diese Klasse in unserem Vordergrund Dienste nutzen können. Zum Beispiel haben wir MyFirstService.java & MySecondService.java:

MyFirstService.java

public class MyFirstService extends Service { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     startForeground(NotificationCreator.getNotificationId(), 
       NotificationCreator.getNotification(this)); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

MySecondService.java

public class MySecondService extends Service { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     startForeground(NotificationCreator.getNotificationId(), 
       NotificationCreator.getNotification(this)); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

nur versuchen, diese Dienste auszuführen. Voila! Sie haben eine einzelne Benachrichtigung für mehrere Vordergrunddienste;)!

+0

Wenn Sie RemoteViews verwenden, um das Benachrichtigungslayout zu definieren, haben Sie immer noch das Problem ... –