Android Notification triggering on application startup

风流意气都作罢 提交于 2019-12-23 04:56:39

问题


I'm trying to get my Daily Notification Service working properly but I am stuck with an issue.

I should receive a notification only at a specific time of the day in the future but I noticed that

if (time_that_i_set_for_notification < current_time_of_the_day) notification triggers at the boot of my app

That's wrong because in that condition, the notification should trigger only the next day, not in the instant I launch the app.

Here's my attempt to get the things working:

I call this in my MainActivity, onCreate() method:

private void scheduleNotification(int hour, int minute){
    Intent notificationIntent = new Intent(this, NotificationReceiver.class);
    notificationIntent.putExtra("notifId", notifId);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, notifId, notificationIntent, 0);

// Set the alarm to start at approximately at a time
        DatePicker datePicker = new DatePicker(this);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
        if(calendar.getTime().compareTo(new Date()) < 0) calendar.add(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 12);
        calendar.set(Calendar.MINUTE, 12);

        AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
// With setInexactRepeating(), you have to use one of the AlarmManager interval
// constants--in this case, AlarmManager.INTERVAL_DAY.
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, pendingIntent);
    }

I thought that adding if(calendar.getTime().compareTo(new Date()) < 0) calendar.add(Calendar.DAY_OF_MONTH, 1); I would've achieved the result I needed.

Thank you and have a nice day.


回答1:


Before calling setInexactRepeating, add this check:

if (calendar.getTimeInMillis() < System.currentTimeMillis())
    calendar.setTimeInMillis(calendar.getTimeInMillis() + AlarmManager.INTERVAL_DAY);

Hope this helps.




回答2:


Ok there's a wrong check there, if you change it, you should be able to solve your issue.

Here we go:

Intent notificationIntent = new Intent(this, NotificationReceiver.class);
    notificationIntent.putExtra("notifId", notifId);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, notifId, notificationIntent, 0);

// Set the alarm to start at approximately at a time
        DatePicker datePicker = new DatePicker(this);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
        //if(calendar.getTime().compareTo(new Date()) < 0) calendar.add(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 14);
        calendar.set(Calendar.MINUTE, 50);
        if (calendar.getTimeInMillis() < System.currentTimeMillis()) calendar.setTimeInMillis(calendar.getTimeInMillis() + AlarmManager.INTERVAL_DAY);
        AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
// With setInexactRepeating(), you have to use one of the AlarmManager interval
// constants--in this case, AlarmManager.INTERVAL_DAY.

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, pendingIntent);

I commented //if(calendar.getTime().compareTo(new Date()) < 0) calendar.add(Calendar.DAY_OF_MONTH, 1); because it should be unnecessary.

Let me know if it worked.

UPDATE: You should totally check whether the Service that handles your daily notification is high consume or not. A High-draining battery app would bother your users.



来源:https://stackoverflow.com/questions/42696079/android-notification-triggering-on-application-startup

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!