Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Уведомление, которое не исчезает после закрытия приложения

В операции (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).

Комментариев нет:

Отправить комментарий