В операции (Activity) я несколько раз шлю запросы сервису, наследующемуся от IntentService
int peopleCount = people.size();
int cur = 0;
for (Person person : people) {
cur++;
Intent intent = new Intent(this, MailService.class);
intent.putExtra("LAST", cur == peopleCount);
startService(intent);
}
Сам сервис выглядит следующим образом:
public class MyService extends IntentService {
final int NOTIFICATION_ID = 10;
public MyService() {
super("MyService");
}
@Override
public void onCreate() {
super.onCreate();
Notification notification = getNotification(getApplicationContext().getString(R.string.notification_about));
updateNotification(notification);
startForeground(NOTIFICATION_ID, notification);
}
@Override
protected void onHandleIntent(@Nullable final Intent intent) {
final boolean last = intent.getBooleanExtra("LAST", false);
...
if (last) {
try {
Log.e(LOG_TAG, "TRYING TO KILL NOTIFICATION");
NotificationManager nMgr = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
nMgr.cancel(NOTIFICATION_ID);
} catch (Exception ex) {
Log.e(LOG_TAG, "Exception: ", ex);
}
}
}
}
private void updateNotification(Notification notification) {
NotificationManager notificationManager =
(NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, notification);
}
private Notification getNotification(String text){
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
return new Notification.Builder(getApplicationContext())
.setSmallIcon(R.drawable.ic_main)
.setContentTitle(getApplicationContext().getString(R.string.app_name))
.setContentText(text)
.setContentIntent(resultPendingIntent)
.build();
}
}
Т.е. я хочу при первом запуске сервиса создавать уведомление, а когда метод onHandleIntent() выполняется последний раз - я хочу, чтобы уведомление исчезало (из области уведомлений и из панели уведомлений). И данный код вроде бы работает так, как нужно... Но только в случае, если ничего не делать. Т.е., если ничего не нажимать, уведомление сначала появляется в области уведомлений, а затем, через какое-то время, исчезает. Однако если закрыть приложение после того, как уведомление появилось в области уведомлений, оно не пропадает и остаётся висеть в области уведомлений и панели уведомлений "навечно" (до перезагрузки телефона, например). При этом в логах всё равно в этом случае выводится строка:
TRYING TO KILL NOTIFICATION
а исключений никаких не выбрасывается.
В чём причина такого поведения? И как всё-таки решить эту проблему, сделать так, чтобы и после закрытия приложения уведомление исчезало?
Ответ
Обязательное требование режима foreground сервиса - это уведомление, сигнализирующее о том, что он работает. Поэтому метод startForeground требует на вход notification и делает его не удаляемым до завершения режима foreground.
Когда foreground нам больше не нужен - мы можем вызвать метод stopForeground, передав ему флаг о необходимости убрать или оставить уведомление. Но в любом случае после вызова stopForeground уведомление можно удалить (даже если оно было выведено другим экземпляром сервиса, и этот факт используется как хак для сокрытия foreground).
Комментариев нет:
Отправить комментарий