title: Trigger a Local Notification every day at particular time even when the app is closed
body: <p><strong>I have to display a notification every day at particular time <em>(say 7.00am)</em> to the users from my app even when my app was not running.(closed)</strong></p>
  
  <p><em>As the content of the notification will be user specific, I cant use (GCM)push</em> </p>
  
  <p>I have gone through a lot of tutorials and answers but I cant able to display notification when the app is closed (not running).</p>
  
  <p><strong>Edit: Using the below code I'm able to Create a Notification while my app is running, if I close my app notifications are showing up</strong></p>
  
  <p><strong>Here is my main activity</strong></p>
  
  <pre><code>public class MainActivity extends AppCompatActivity {
  Button setAlarm;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  
      setAlarm = (Button) findViewById(R.id.set_alarm);
      setAlarm.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              NotificationEventReceiver.setupAlarm(getApplicationContext());
          }
      });
  }
  @Override
  protected void onNewIntent(Intent intent) {
      super.onNewIntent(intent);
      setIntent(intent);
  }
  }
  </code></pre>
  
  <p>here when I click the set Alarm button my <code>NotificationEventReciver</code> will call</p>
  
  <pre><code>public class NotificationEventReceiver extends WakefulBroadcastReceiver {
  private static final String ACTION_START_NOTIFICATION_SERVICE = "ACTION_START_NOTIFICATION_SERVICE";
  private static final String ACTION_DELETE_NOTIFICATION = "ACTION_DELETE_NOTIFICATION";
  
  
  public static void setupAlarm(Context context) {
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      Intent intent = new Intent(context, NotificationEventReceiver.class);
      PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, getTriggerAt(new Date()), 2 * 60 * 1000, alarmIntent);
  
  }
  private static long getTriggerAt(Date now) {
      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());
      calendar.set(Calendar.HOUR_OF_DAY, 17);
      calendar.set(Calendar.MINUTE, 10);
      System.err.println(now.getTime()+"-----&gt;"+ calendar.getTimeInMillis());
      return calendar.getTimeInMillis();
  }
  
  public static void cancelAlarm(Context context) {
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      PendingIntent alarmIntent = getStartPendingIntent(context);
      alarmManager.cancel(alarmIntent);
  }
  
  
  private static PendingIntent getStartPendingIntent(Context context) {
      Intent intent = new Intent(context, NotificationEventReceiver.class);
      intent.setAction(ACTION_START_NOTIFICATION_SERVICE);
      return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  }
  
  public static PendingIntent getDeleteIntent(Context context) {
      Intent intent = new Intent(context, NotificationEventReceiver.class);
      intent.setAction(ACTION_DELETE_NOTIFICATION);
      return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  }
  
  @Override
  public void onReceive(Context context, Intent intent) {
      Intent serviceIntent =  NotificationIntentService.createIntentStartNotificationService(context);
      if (serviceIntent != null) {
          System.err.println("onReceive inside not null");
          // Start the service, keeping the device awake while it is launching.
          startWakefulService(context, serviceIntent);
      }
  }
  }
  </code></pre>
  
  <p>My service class which will run when alarm get off.</p>
  
  <pre><code>public class NotificationIntentService extends IntentService {
  
  private static final int NOTIFICATION_ID = 1;
  private static final String ACTION_START = "ACTION_START";
  private static final String ACTION_DELETE = "ACTION_DELETE";
  
  public NotificationIntentService() {
      super(NotificationIntentService.class.getSimpleName());
  }
  
  public static Intent createIntentStartNotificationService(Context context) {
      Intent intent = new Intent(context, NotificationIntentService.class);
      intent.setAction(ACTION_START);
      return intent;
  }
  
  @Override
  protected void onHandleIntent(Intent intent) {
      System.err.println("onHandleIntent, started handling a notification event");
      try {
          String action = intent.getAction();
          if (ACTION_START.equals(action)) {
              System.err.println("enters the loop ACTION_START");
              processStartNotification();
          }
      } finally {
          WakefulBroadcastReceiver.completeWakefulIntent(intent);
      }
  }
  
  
  private void processStartNotification() {
      // Do something. For example, fetch fresh data from backend to create a rich notification?
      System.err.println("inside the notify method");
      Intent mainIntent = new Intent(this, MainActivity.class);
      PendingIntent pendingIntent = PendingIntent.getActivity(this, NOTIFICATION_ID, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  
      final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
      builder.setContentTitle("Scheduled Notification")
              .setAutoCancel(true)
              .setColor(getResources().getColor(R.color.colorAccent))
              .setContentText("This notification has been triggered by Notification Service")
              .setSmallIcon(R.drawable.ic_launcher);
  
      builder.setContentIntent(pendingIntent);
  
      final NotificationManager manager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
      manager.notify(NOTIFICATION_ID, builder.build());
  }
  }
  </code></pre>