14

メールを送信するサービス(EmailService)を作成しました...アプリでメールを送信する必要があるたびに、サービスを開始し、インテントを介してメールのIDを渡します...

startforeground(id_of_email, mynotifcation);殺されるのを防ぎ、メール送信のステータスをユーザーに通知するために使用しています。

ユーザーが一度に複数の電子メールを送信できるようにする必要があるため、ユーザーが別の電子メールを送信する必要がある場合startservice、新しい意図 (電子メールの別の ID) で再度呼び出します...startforeground(new_id_of_email, mynotifcation);もう一度呼び出します。

問題は、新しい呼び出しがstartforeground以前の通知を上書きすることです... (そのため、ユーザーは以前の通知を失い、以前の電子メールで何が起こっているのかわかりません)

4

3 に答える 3

6

ソースを見ると、Service.startForeground()startForeground を複数回呼び出しても、現在表示されている通知のみが置き換えられることがわかります。実際、startForeground の呼び出しは と同じですがstopForeground()removeNotificationset が常に true に設定されているだけです。

進行中の各メールの通知を表示するサービスを希望する場合は、各通知をサービスから個別に管理する必要があります。

public final void startForeground(int id, Notification notification) {
    try {
        mActivityManager.setServiceForeground(
                new ComponentName(this, mClassName), mToken, id,
                notification, true);
    } catch (RemoteException ex) {
    }
}

public final void stopForeground(boolean removeNotification) {
    try {
        mActivityManager.setServiceForeground(
                new ComponentName(this, mClassName), mToken, 0, 
                null, removeNotification);
    } catch (RemoteException ex) {
    }
}

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/Service.java#Service.startForeground%28int%2Candroid.app.Notification %29

于 2015-02-26T00:02:27.313 に答える
2

STOP_FOREGROUND_DETACHフラグを使用することもできます。

ドキュメントからの引用:

STOP_FOREGROUND_DETACH

API レベル 24 で追加 int STOP_FOREGROUND_DETACH stopForeground(int) のフラグ: 設定されている場合、以前に startForeground(int, Notification) に提供された通知がサービスから切り離されます。STOP_FOREGROUND_REMOVE が設定されていない場合にのみ意味があります。この場合、通知は表示されたままになりますが、サービスから完全に切り離されているため、通知マネージャーを直接呼び出す以外は変更されません。

定数値: 2 (0x00000002)

したがって、あなたへの繰り返しの呼び出しの前に、 を呼び出すことstartForeground()ができますstopForeground(STOP_FOREGROUND_DETACH);。これにより通知が切り離され、別の通知 ID を使用する場合、を繰り返し呼び出してstartForeground()も変更されません。

さらに、「切り離された」通知は現在、「進行中のサービス」を表していないため、ユーザーはスワイプで削除できます。

ボーナス:

互換性のために、ここに記載されているようにServiceCompat、クラスとそのstaticメソッドを使用できます。ServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH)

于 2017-11-02T07:37:31.227 に答える