2013-06-30 2 views
8

Я создал службу (EmailService), которая отправляет электронное письмо ... каждый раз, когда мне нужно отправить электронное письмо с моим приложением, он запускает услугу и передает идентификатор электронной почты с намерением ...несколько вызовов для начала?

i я использую startforeground(id_of_email, mynotifcation);, чтобы предотвратить его убийство и показать уведомление пользователю о статусе отправки электронной почты.

Мне нужно разрешить пользователю отправлять несколько писем в то время, поэтому, когда пользователю необходимо отправить другое электронное письмо, он снова вызывает startservice с новым намерением (другой идентификатор электронной почты) ... поэтому он вызывает startforeground(new_id_of_email, mynotifcation); еще раз ,

проблема заключается в том, что новый вызов startforeground перезаписывает предыдущее уведомление ... (так что пользователь теряет предыдущее уведомление и не знает, что происходит с его предыдущей электронной почтой)

+0

Не стоит ли ставить задачи в базу данных или что-то в этом роде? таким образом, как только первое будет сделано, служба обновит это, чтобы сделать или удалить его, и проверить, есть ли что-то еще. Может быть, сообщение, чтобы продолжать кормить услугу с большим количеством задач – eduyayo

ответ

2

Глядя на Service.startForeground() источник показывает, что несколько вызовов 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:

STOP_FOREGROUND_DETACH

добавленного в уровне API 24 INT STOP_FOREGROUND_DETACH Флаг для stopForeground (INT): если установлено, уведомление, ранее предоставленные startForeground (интермедиат, Уведомление) будут отделены от службы. Имеет смысл только в том случае, если STOP_FOREGROUND_REMOVE не установлен - в этом случае уведомление будет отображаться, но будет полностью отключено от услуги и поэтому не будет изменено, кроме как посредством прямых звонков в диспетчер уведомлений.

Константа Значение: 2 (0x00000002)

Итак, перед повторным вызовом startForeground() вы можете позвонить stopForeground(STOP_FOREGROUND_DETACH);. Это отделит уведомление, и повторные вызовы на startForeground() не будут вносить в него изменения, , если вы используете другой идентификатор уведомления.

Кроме того, «отсоединенное» уведомление теперь не представляет «текущую службу» и, следовательно, может быть удалено пользователем с помощью салфетки.

БОНУС:

Для совместимости, можно использовать ServiceCompat класс и его метод staticServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH) как документально here.

Смежные вопросы