Отображение строки состояния уведомления от сервиса в Android
Привет, у меня какая-то глупая проблема. Я пытаюсь отобразить уведомление от службы. Когда начинается действие, я вызываю startService следующим образом:
Intent myIntent = new Intent(getApplicationContext(),notif_service.class);
startService(myIntent);
служба рассчитывает что-то и должна отобразить уведомление и затем остановиться. код выглядит следующим образом:
if (limit_time_value == 2 && start >= 6300000 && notif_past)
{
notif_past=false;
showNotification();
stopSelf();
}
Есть два способа, которыми эта служба может быть остановлена, эфир из себя с помощью stopSelf() или кнопка в моей активности с
Intent myIntent = new Intent(getApplicationContext(),notif_service.class);
stopService(myIntent);
проблема в том, что даже когда я останавливаю службу, уведомление показывается по истечении указанного времени. Я попытался остановить setvice с помощью Binding, а затем вызвал onDestroy(), в котором я отменил уведомление и снова вызвал stopSelf(). Снова показывается уведомление.
Что я делаю неправильно? Я неправильно понимаю, как работают уведомления или службы?
2 ответа
Вы не указываете точно, где вы выполняете работу, показанную во втором фрагменте кода выше.
Если эта работа делается в
onStart()
или жеonStartCommand()
эта работа выполняется в главном потоке приложения, и поэтому, как только она запускается, она блокирует всю другую работу основного потока приложения, такую какstopService()
а такжеonDestroy()
,Если эта работа выполняется в фоновом потоке, который вы создаете, если вы не завершаете этот фоновый поток, этот поток будет продолжать выполнение независимо от того, уничтожена ли служба. Вам нужно будет договориться о прекращении потока самостоятельно.
Вызовите экземпляр класса NotificationManager, который вы вызвали внутри showNotification()
функция.
Например, я использовал:
NotificationManager nm=(NotificationManager)this.getSystemService(this.NOTIFICATION_SERVICE);
nm.notify(1,builder.build());
Если вы сделали что-то подобное для создания своего уведомления, используйте тот же экземпляр, чтобы отменить его, вызвав cancel()
функция и прохождение notificationId
(в данном случае 1).
Например:
nm.cancel(1);
Здесь 1 обозначает notificationID
который вы предоставили при его создании.