Ежедневное уведомление приложения Android с использованием таймера - PullRequest
0 голосов
/ 26 сентября 2018

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

Это методы таймера, используемые в моем классе службы уведомлений:

public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer
        Calendar today = Calendar.getInstance();
        Calendar tomorrow = Calendar.getInstance();
        tomorrow.set(Calendar.HOUR_OF_DAY, 17);
        tomorrow.set(Calendar.MINUTE, 2);
        tomorrow.set(Calendar.SECOND, 0);
        if(today.compareTo(tomorrow) > 0)
            tomorrow.add(DATE, 1);
        long initialDelay = tomorrow.getTimeInMillis() - today.getTimeInMillis();
        timer.scheduleAtFixedRate(timerTask, initialDelay, 1000*60*60*24);
    }

public void initializeTimerTask() {

        timerTask = new TimerTask() {
            public void run() {

                //use a handler to run a toast that shows the current timestamp
                handler.post(new Runnable() {
                    public void run() {

                        sendNotification();

                    }
                });
            }
        };
    }

Я вызываю класс службы уведомлений в методе onStop () в моем классе MainActivity.class, используя:

startService(new Intent(this, NotificationService.class));

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я использовал этот код в своем проекте, и он работал гладко:

   public void setAlarm() {

    Intent serviceIntent = new Intent(this, CheckRecentRun.class);
    PendingIntent pi = PendingIntent.getService(this, 131313, serviceIntent,
                                                PendingIntent.FLAG_CANCEL_CURRENT);

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delay, pi);
    Log.v(TAG, "Alarm set");        
}
public void sendNotification() {

    Intent mainIntent = new Intent(this, MainActivity.class);
    @SuppressWarnings("deprecation")
    Notification noti = new Notification.Builder(this)
        .setAutoCancel(true)
        .setContentIntent(PendingIntent.getActivity(this, 131314, mainIntent,
                          PendingIntent.FLAG_UPDATE_CURRENT))
        .setContentTitle("We Miss You!")
        .setContentText("Please play our game again soon.")
        .setDefaults(Notification.DEFAULT_ALL)
        .setSmallIcon(R.drawable.ic_launcher)
        .setTicker("We Miss You! Please come back and play our game again soon.")
        .setWhen(System.currentTimeMillis())
        .getNotification();

    NotificationManager notificationManager
        = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(131315, noti);

    Log.v(TAG, "Notification sent");        
}

, где я взял ссылку для моего проекта эту ссылку :

https://stackoverflow.com/a/22710380/7319704

0 голосов
/ 26 сентября 2018

Я рекомендую вам заглянуть в AlarmManager, чтобы добиться этого.Вам не нужно изобретать велосипед для этого.Он позволяет вам разбудить приложение, установив временные интервалы.

alarmMgr.setRepeating(
        AlarmManager.RTC_WAKEUP,
        calendar.timeInMillis,
        1000 * 60 * 20,
        alarmIntent
)

Кроме того, имейте в виду, что startService больше не будет работать на телефонах Android 8 с 1 ноября.Я рекомендую использовать WorkManager.

...