Не удается отменить уведомление после его обновления - PullRequest
0 голосов
/ 13 июля 2020

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

Пока мне удалось заставить его работать для простого уведомления с текстом 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();
    }
}

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Сначала создайте такой таймер

private Timer timer;
    private TimerTask timerTask;
    public void startTimer() {
        timer = new Timer();
        timerTask = new TimerTask() {
            public void run() {
                // Add your code
            }
        };
        timer.schedule(timerTask, 1000, 1000); //
    }

Также вам нужно остановить свой таймер. Итак,

 public void stoptimertask() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

Вызовите StartTimer и StopTimer в OnStartCommand () и onDestroy () соответственно. Добавьте эти строки в onDestroy ()

Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("restartservice");
        broadcastIntent.setClass(this, Restarter.class);
        this.sendBroadcast(broadcastIntent);
0 голосов
/ 13 июля 2020

это может быть обработано несколькими способами, вы не остановили свой таймер

Примечание: - код публикации в Kotlin

1)

override fun onDestroy() {
   counter.cancel()
}
в вашей деятельности
override fun onResume() {
    super.onResume()
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
     notificationManager.cancelAll()
}
...