Я разрабатываю приложение обратного отсчета и сейчас пытаюсь показать уведомление, когда вы выходите из приложения во время обратного отсчета. Соответственно, я хочу, чтобы уведомление исчезало, когда пользователь возвращается в приложение.
Пока мне удалось заставить его работать для простого уведомления с текстом c stati, сделайте следующее: в MainActivity. java, в onStop () я создаю намерение и запускаю службу с помощью startService (intent). Симметрично в onStart () я запускаю stopService (intent), чтобы при возврате в приложение служба отменялась. Это работает как чудо: уведомление появляется и исчезает, когда это необходимо.
На следующем шаге была попытка заставить уведомление отображать изменяющийся текст (будет написано «Осталось X минут»). Согласно имеющейся информации, для обновления существующего уведомления вам необходимо создать новое, присвоить ему тот же идентификатор, что и существующий, и вызвать .notify для NotificationManager. Когда я это делаю, уведомление действительно обновляется правильно (текст изменяется, как ожидалось), НО: теперь возврат к основному действию не отменяет уведомление. Значок остается там и не прерывается.
Я много часов пытался решить эту проблему. Я также пробовал использовать такие хаки, как отправка сигналов через общие настройки, чтобы сообщить сервису об остановке, но по какой-то причине он, кажется, полностью игнорирует и команду stopself ().
Есть ли у кого-нибудь предложения о том, что может быть причиной? Любая помощь будет принята с благодарностью. Вот соответствующий код:
MainActivity. java:
@Override
protected void onStart() {
super.onStart();
Intent serviceIntent = new Intent(getBaseContext(), CounterService.class);
stopService(serviceIntent);
}
protected void onStop() {
super.onStop();
Intent serviceIntent = new Intent(getBaseContext(), CounterService.class);
startService(serviceIntent);
}
CounterService. java:
public class CounterService extends Service {
Notification notification;
NotificationManager notificator;
Intent intentNoti;
CountDownTimer counter;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
intentNoti = new Intent(this, MainActivity.class);
final PendingIntent pending = PendingIntent.getActivity(this, 0, intentNoti, 0);
final Bitmap icon = BitmapFactory.decodeResource(getResources(),
R.drawable.common_full_open_on_phone);
//Countdown
counter = new CountDownTimer (30000, 1000) {
public void onTick(long millisUntilFinished) {
String time = String.valueOf(System.currentTimeMillis());
notification = new Notification.Builder(CounterService.this)
.setContentTitle("Name")
.setContentText(time)
.setSmallIcon(R.drawable.icon_start)
.setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
.setContentIntent(pending)
.setOngoing(true).build();
notificator = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificator.notify(1001, notification);
}
public void onFinish() {
}
}.start();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
counter.cancel();
}
}