Search code examples
androidalarmmanagerandroid-notificationsreminders

How to launch a notification in conjunction with AlarmManager?


I am trying to figure out how I should launch a notification. Creating the notification is not what I am asking, but rather a way to launch it in the background so its unobtrusive and the user can do whatever they were doing. Its for a calendar, a reminder to be exact. It is also important to note I am using AlarmManager.

  1. What method should I use to run it in the background. BroadCastReciever, Service, etc.

  2. Research I have found also presents a problem with AlarmManager. When the app is killed or phone is turned off, the alarm is also. What other method should I use in order to make sure the notification is guaranteed to show for that event reminder?

If any additional info is needed please ask and I shall do so. Thanks in advance.


Solution

  • Create a broadcastreceiver or intentservice. Then...

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    
    
    Date date = new Date(); //set this to some specific time
    or Calendar calendar = Calendar.getInstance();
    
    //set either of these to the correct date and time. 
    
    then 
    Intent intent = new Intent();
    //set this to intent to your IntentService or BroadcastReceiver
    //then...
    PendingIntent alarmSender = PendingIntent.getService(context, requestCode, intent,
                                PendingIntent.FLAG_CANCEL_CURRENT);
    //or use PendingIntent.getBroadcast if you're gonna use a broadcast
    
                    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mAlarmSender); // date.getTime to get millis if using Date directly. 
    

    If you'd like these alarms to work correctly even when the phone is restarted, then add:

            <action android:name="android.intent.action.BOOT_COMPLETED"/>
    

    as intentfilter on your Receiver in the manifest and recreate your alarms in onReceive.

    EDIT

    When you create a BroadcastReceiver in your application, it allows to do exactly what it sounds like: receive broadcasts in the system. So for example, you might some BroadcastReceiver like so:

    public class MyAwesomeBroadcastReceiver extends BroadcastReceiver {
    
    //since BroadcastReceiver is an abstract class, you must override the following:
    
        public void onReceive(Context context, Intent intent) {
           //this method gets called when this class receives a broadcast
        }
    }
    

    To send broadcasts to this class explicitly, you define the receiver inside of the manifest, as follows:

    <receiver android:name="com.foo.bar.MyAwesomeBroadcastReceiver" android:enabled="true" android:exported="false">
                <intent-filter>
    
                    <action android:name="SOME_AWESOME_TRIGGER_WORD"/>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    
    
    
    
                </intent-filter>
            </receiver>
    

    Having this in the manifest gets you two things: You can send a broadcast explicitly to your receiver whenever you want by

    Intent i = new Intent("SOME_AWESOME_TRIGGER_WORD");
                    sendBroadcast(intent);
    

    Also, since you've told android you'd like to receive the BOOT_COMPLETED action which is broadcast by the system, your receiver will also get called when that happens.