web-dev-qa-db-ja.com

startForeground()呼び出しを使用した複数のフォアグラウンドサービスの単一通知

2つのサービスがあるアプリがあります。

1つは、WindowManagerを使用して他のアプリでフローティング(オーバーレイ)のUIを表示するためのものです。もう1つは、GooglePlayAPIを使用した位置追跡用です。私のアプリは常にこれらのサービスを実行します。

これらのサービスがOSによって強制終了されないようにしたいと思います。だから私はService.startForeground()を呼び出します。ただし、通知ドロワーには2つの通知があります。

両方のサービスに単一の通知を使用する方法はありますか?

15
Peter Han

はい、可能です。

Service.startForeground()署名を見ると、通知IDと通知自体の両方を受け入れます( ドキュメントを参照 )。したがって、複数のフォアグラウンドサービスに対して単一の通知のみを使用する場合、これらのサービスは同じ通知と通知IDを共有する必要があります。

シングルトンパターンを使用して、同じ通知と通知IDを取得できます。実装例は次のとおりです。

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;
    }
}

したがって、このクラスをフォアグラウンドサービスで使用できます。たとえば、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;
    }
}

これらのサービスを実行してみてください。出来上がり!複数のフォアグラウンドサービスに対して単一の通知があります;)!

21