Android Notification at time

26,799

Finally I was able to find the solution:

private void handleNotification() {
    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5000, pendingIntent);
}

This is my custom BroadcastReceiver:

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Calendar now = GregorianCalendar.getInstance();
        int dayOfWeek = now.get(Calendar.DATE);
        if(dayOfWeek != 1 && dayOfWeek != 7) {
            NotificationCompat.Builder mBuilder = 
                    new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(context.getResources().getString(R.string.message_box_title))
                    .setContentText(context.getResources().getString(R.string.message_timesheet_not_up_to_date));
            Intent resultIntent = new Intent(context, MainActivity.class);
            TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
            stackBuilder.addParentStack(MainActivity.class);
            stackBuilder.addNextIntent(resultIntent);
            PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
            mBuilder.setContentIntent(resultPendingIntent);
            NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(1, mBuilder.build());
        }
    }
}

And this in the manifest in the application tag:

<receiver
        android:name="be.menis.timesheet.service.AlarmReceiver"
        android:process=":remote" />
Share:
26,799
Valentin Grégoire
Author by

Valentin Grégoire

Updated on July 09, 2022

Comments

  • Valentin Grégoire
    Valentin Grégoire almost 2 years

    I am looking for hours now how to do this exactly:

    I want that every day (except weekends) a notification is sent at a time (let's say 18:00 (= 6pm)) except for when the app is open already. It's basically like the gmail app when you receive a mail. When the user clicks the notification it should disappear and should be brought to the MainActivity.

    I have tried numerous things with the AlarmManager, but none have resulted in a notification showing up.

    The code I tried, which I feel is pretty close to being correct, is following: In my MainActivity:

    AlarmManager alarmManager = (AlarmManager) this.getSystemService(ALARM_SERVICE);
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 18);
    Intent intent = new Intent(this, NotificationService.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    

    My NotificationService:

    public class NotificationService extends IntentService {
    
    
    
        public NotificationService() {
            super("NotificationService");
        }
    
        @Override
        @SuppressWarnings("deprecation")
        protected void onHandleIntent(Intent intent) {
            NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new Notification(R.drawable.ic_launcher, "reminder", System.currentTimeMillis());
            notification.defaults |= Notification.DEFAULT_SOUND;
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            Intent notificationIntent = new Intent(this, MainActivity.class);
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent , 0);
            notification.setLatestEventInfo(getApplicationContext(), "It's about time", "You should open the app now", contentIntent);
            nm.notify(1, notification);
        }
    }
    

    Notice I use deprecated stuff because this was even the only way a notification ever showed up while not working with the AlarmManager. If possible, please react with a solution that does not have the deprecated stuff in it, but with up to date stuff :P.

    Many many many thanks in advance!!!

    Kindest regards