Остановить уничтожение уведомления при закрытии приложения

#java #android #android-notifications #countdowntimer

#java #Android #android-уведомления #Таймер обратного отсчета

Вопрос:

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

Есть ли какой-либо способ разрешить продолжение работы уведомления после закрытия приложения и не уничтожать его.

Вот код для запуска моего уведомления и таймера:

 final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "notifyLemubit")
                            .setSmallIcon(holder.img_timer.getImageAlpha())
                            .setContentTitle("Timer Running")
                            .setContentText("Time Until Your "   timer.getTimer_name()   " Tree has Fully Grown: "   timer.getTimer_duration_s())
                            .setOngoing(true)
                            .setPriority(NotificationCompat.PRIORITY_DEFAULT);

                    final NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
                    notificationManagerCompat.notify(timer.getTimer_id(), builder.build());

                    new CountDownTimer(10 * ONE_SECOND, ONE_SECOND) {

                        @Override
                        public void onTick(long ms_until_done) {
                            builder.setContentText("Time Until Your "   timer.getTimer_name()   " Tree has Fully Grown: "   ms_until_done / ONE_SECOND);
                            notificationManagerCompat.notify(timer.getTimer_id(), builder.build());
                        }

                        @Override
                        public void onFinish() {
                            notificationManagerCompat.cancel(timer.getTimer_id());
                            final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "notifyLemubit")
                                    .setSmallIcon(holder.img_timer.getImageAlpha())
                                    .setContentTitle("Timer Finished")
                                    .setContentText("Your "   timer.getTimer_name()   " is Fully Grown!")
                                    .setPriority(NotificationCompat.PRIORITY_DEFAULT);

                            final NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
                            notificationManagerCompat.notify(timer.getTimer_id(), builder.build());
                        }
                    }.start();
  

Любая помощь приветствуется, спасибо

Ответ №1:

Единственный известный мне способ — использовать службу переднего плана путем расширения класса Service or IntentService

И внутри вашей активности или адаптера используйте это для запуска службы

 context.startService(Intent(context,PersistentNotificationService.class))
  

Для службы здесь используйте этот

 public class PersistentNotificationService extends Service {

    private final static int ONE_SECOND = 1000;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "notifyLemubit")
                .setSmallIcon(R.drawable.img_timer)
                .setContentTitle("Timer Running")
                .setContentText("Your title goes here")
                .setOngoing(true)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);


        new CountDownTimer(10 * ONE_SECOND, ONE_SECOND) {

            @Override
            public void onTick(long ms_until_done) {
                // Whatever code you want here
            }

            @Override
            public void onFinish() {
                // To cancel , just close the service
                stopForeground(true);
                stopSelf();
            }
        }.start();

        startForeground(2342, builder.build());

        return START_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}