2013-06-30 3 views
8

私の電子メールを送信するサービス(EmailService)を作成している...私は私のアプリで電子メールを送信する必要があるたびに、それがサービスを開始し、意思を経由して電子メールのIDを渡す...startforegroundへの複数コール?

私はstartforeground(id_of_email, mynotifcation);を使用して、電子メールが送信されないようにし、電子メール送信のステータスを通知します。

私は、ユーザーが別の電子メールを送信する必要があるときに、それが再び新しい目的(電子メールの異なるID)とstartserviceを呼び出して...それが再びstartforeground(new_id_of_email, mynotifcation);を呼び出して、ユーザーが一度に複数の電子メールを送信できるようにする必要があります。

問題がstartforegroundに新しいコールがService.startForeground()を見てみると、以前の通知...(ので、ユーザは、前の通知を失い、彼の前のメールで何が起こっているかを知りません)

+0

データベースなどのタスクをキューに入れない方が良いですか?そうすれば、最初の処理が完了すると、サービスはそれを更新または削除して、何か他のことがあるかどうかを確認します。たぶん、より多くのタスクでサービスを提供し続けるメッセージキュー – eduyayo

答えて

2

を上書きするということですstartForegroundを複数回呼び出すと、現在表示されている通知が置き換えられます。実際、startForegroundの呼び出しはstopForeground()と同じですが、removeNotificationが常に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

0

一つもSTOP_FOREGROUND_DETACHフラグを使用することができます。 documentationから引用

stopForeground(INT)のためのAPIレベル24 INT STOP_FOREGROUND_DETACHフラグに加えSTOP_FOREGROUND_DETACH

:設定、通知は、以前 startForeground(INT、通知)に設けられている場合サービスから切り離されます。 STOP_FOREGROUND_REMOVEが設定されていない場合にのみ意味があります。この の場合、通知は表示されますが、 を通知マネージャに直接呼び出す以外は、サービスから完全に切り離されます。

定数値:2(0x00000002)

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

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

BONUS:互換性のため

here記載されたように、一方がServiceCompatクラスとそのstatic方法ServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH)を使用することができます。