title: Android AlarmReceiver and BootReceiver
body: <p>In my application, I create alarms. So, when the phone is rebooted, I need to create again the alarms.</p>
  
  <p>But when I reboot the phone (emulator) and that alarms must be created, there is a Force Close. It says : </p>
  
  <pre><code>Unable to instantiate receiver com.yannv.vehiclesmanager.AlarmReceiver: 
  java.lang.ClassNotFoundException: com.yannv.vehiclesmanager.AlarmReceiver in loader
  dalvik.system.PathClassLoader[/data/app/com..etc]
  </code></pre>
  
  <p>Here is the concerned part of my manifest (don't know if problem comes from there..)</p>
  
  <pre><code>    &lt;receiver android:name="AlarmReceiver"&gt;
          &lt;intent-filter&gt;
              &lt;action
                  android:name="afficherNotification" /&gt;
              &lt;data
                  android:scheme="rappel" /&gt;
          &lt;/intent-filter&gt;
      &lt;/receiver&gt;
  
      &lt;receiver android:name="com.yannv.vehiclesmanager.BootReceiver"&gt;
          &lt;intent-filter&gt;
              &lt;action android:name="android.intent.action.BOOT_COMPLETED" /&gt;
          &lt;/intent-filter&gt;
      &lt;/receiver&gt;
  
  &lt;/application&gt;
  
  &lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /&gt;
  </code></pre>
  
  <p></p>
  
  <p>Thanks for your help</p>
  
  <p>BootReceiver Class :</p>
  
  <pre><code>package com.yannv.vehiclesmanager;
  import java.text.ParseException;
  import java.text.SimpleDateFormat;
  import java.util.Date;
  import android.app.AlarmManager;
  import android.app.PendingIntent;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.database.Cursor;
  
  public class BootReceiver extends BroadcastReceiver{
  
  /*Lorsqu'on éteint le téléphone, les alarmes sont supprimées. Cette méthode est appelée
  au démarrage du téléphone et sert à recréer les alarmes*/
  
  public void onReceive(Context context, Intent in) {
  
      final int NOT_AUCUN = 0;            //ID des possibilités de notification
      final int NOT_AU_DEBUT = 1;
      final int NOT_10_MINUTES = 2;
      final int NOT_30_MINUTES = 3;
      final int NOT_1_HEURE = 4;
      final int NOT_2_HEURES = 5;
      final int NOT_3_HEURES = 6;
      final int NOT_12_HEURES = 7;
      final int NOT_24_HEURES = 8;
      final int NOT_2_JOURS = 9;
      final int NOT_1_SEMAINE = 10;
  
      final int ID_COLUMN_ID = 0;
      final int ID_COLUMN_DATE = 2;
      final int ID_COLUMN_HEURE = 4;
      final int ID_COLUMN_NOTIF = 7;
  
      int heures;
      int minutes;
      int annee;
      int mois;
      int jour;
  
      Intent intent = new Intent(context, AlarmReceiver.class);
  
      Date dateRappel = null;
      Date dateNotif;
      final SimpleDateFormat dateFormatDB = new SimpleDateFormat ("yyyy'.'MM'.'dd");
  
      DBAdapter db;
  
      AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
  
      db = new DBAdapter(context);
      db.open();
  
      Cursor c = db.recupListeRappelAVenir();
      c.moveToFirst();
  
      for(int i=0;i&lt;c.getCount();i++){
          try {
                  dateRappel = dateFormatDB.parse(c.getString(ID_COLUMN_DATE).toString());
              } catch (ParseException e) {
                  e.printStackTrace();
              }
  
              String[] heureRappel = c.getString(ID_COLUMN_HEURE).toString().split(":");
              heures = (int) Integer.parseInt(heureRappel[0]);
              minutes = (int) Integer.parseInt(heureRappel[1]);
              annee = dateRappel.getYear();
              mois = dateRappel.getMonth();
              jour = dateRappel.getDay();
  
              dateNotif = null;
              dateNotif = new Date (annee, mois, jour, heures, minutes);
  
              PendingIntent sender = PendingIntent.getBroadcast(context, c.getInt(ID_COLUMN_ID), intent, 0);
  
              switch(c.getInt(ID_COLUMN_NOTIF)){
              case NOT_AUCUN :
                  //Pas de notification
                  dateNotif = null;
                  break;
              case NOT_AU_DEBUT :
                  //On ne fait rien
                  break;
              case NOT_10_MINUTES :
                  dateNotif.setTime(dateNotif.getTime()- 600000);
                  break;
              case NOT_30_MINUTES :
                  dateNotif.setTime(dateNotif.getTime()- 1800000);
                  break;
              case NOT_1_HEURE : 
                  dateNotif.setTime(dateNotif.getTime()- 3600000);
                  break;
              case NOT_2_HEURES : 
                  dateNotif.setTime(dateNotif.getTime()- 7200000);
                  break;
              case NOT_3_HEURES : 
                  dateNotif.setTime(dateNotif.getTime()- 10800000);
                  break;
              case NOT_12_HEURES : 
                  dateNotif.setTime(dateNotif.getTime()- 43200000);
                  break;
              case NOT_24_HEURES : 
                  dateNotif.setTime(dateNotif.getTime()- 86400000);
                  break;
              case NOT_2_JOURS : 
                  dateNotif.setTime(dateNotif.getTime() - 172800000);
                  break;
              case NOT_1_SEMAINE : 
                  dateNotif.setTime(dateNotif.getTime() - 604800000);
                  break;
              }
  
              if (dateNotif != null){
                  am.set(AlarmManager.RTC_WAKEUP, dateNotif.getTime(), sender);
              }
  
              c.moveToNext();
          }
  
          c.close();
          db.close();
  
  }
  </code></pre>
  
  <p>}</p>
  
  <p>AlarmReceiver Class </p>
  
  <pre><code>package com.yannv.vehiclesmanager;
  
  import android.app.Notification;
  import android.app.NotificationManager;
  import android.app.PendingIntent;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.util.Log;
  import android.widget.Toast;
  
  public class AlarmReceiver extends BroadcastReceiver{
  
  @Override
  public void onReceive(Context context, Intent intent) {
      try {
          //Création de la notification
          NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
  
          int icon = R.drawable.icon;
          CharSequence tickerText = "Notification de Vehicles Manager";
          long when = System.currentTimeMillis();
          CharSequence contentTitle = "Vehicles Manager : rappel !";
          CharSequence contentText = "Pressez pour voir la liste des rappels";
  
          Intent notificationIntent = new Intent(context, Rappel.class);
          PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
  
          Notification notification = new Notification(icon, tickerText, when);
          notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
          notification.defaults |= Notification.DEFAULT_SOUND;
          notification.defaults |= Notification.DEFAULT_VIBRATE;
          notification.flags = Notification.FLAG_AUTO_CANCEL;
          nm.notify(0, notification);
  
      } catch (Exception exception) {
          Toast.makeText(context, "Vehicle's Manager : erreur lors du lancement d'une notification", Toast.LENGTH_LONG).show();
          Log.e("ALARM_RECEIVER", exception.toString());
      }
  
  }
  </code></pre>
  
  <p>}</p>
  
  <p><strong>EDIT : Problem solved</strong>. It seems that all my problems came from this line of the BootReceiver class:</p>
  
  <pre><code>jour = dateRappel.getDay();
  </code></pre>
  
  <p>I replace it by </p>
  
  <pre><code>jour = dateRappel.getDate();
  </code></pre>
  
  <p>And it works.</p>