2011-09-07 22 views
0

在我的應用程序中,我創建了警報。所以,當手機重新啓動時,我需要再次創建鬧鐘。Android AlarmReceiver和BootReceiver

但是,當我重新啓動手機(模擬器),並且必須創建警報時,有一個強制關閉。它說:

Unable to instantiate receiver com.yannv.vehiclesmanager.AlarmReceiver: 
java.lang.ClassNotFoundException: com.yannv.vehiclesmanager.AlarmReceiver in loader 
dalvik.system.PathClassLoader[/data/app/com..etc] 

這裏是我的清單的相關部分(不知道問題出現在那裏..)

<receiver android:name="AlarmReceiver"> 
     <intent-filter> 
      <action 
       android:name="afficherNotification" /> 
      <data 
       android:scheme="rappel" /> 
     </intent-filter> 
    </receiver> 

    <receiver android:name="com.yannv.vehiclesmanager.BootReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

</application> 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

感謝您的幫助

BootReceiver類別:

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<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(); 

} 

}

AlarmReceiver類

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()); 
    } 

} 

}

編輯:問題解決。看來,我的所有問題來自該行的BootReceiver類的傳來:

jour = dateRappel.getDay(); 

我通過

jour = dateRappel.getDate(); 

取代它和它的作品。

+1

文件結構。澄清更多也提供源代碼 –

回答

0

給出全名的AlarmReceiver

<receiver android:name="com.yannv.vehiclesmanager.AlarmReceiver"> 
    <intent-filter> 
     <action 
      android:name="afficherNotification" /> 
     <data 
      android:scheme="rappel" /> 
    </intent-filter> 
</receiver> 

檢查在AlarmReceiver class.It包的名稱應該是這樣才

package com.yannv.vehiclesmanager; 
+0

Thx但我有相同的力量與您的解決方案 – HerrM

+0

這對我使用'android:name =「com.path.to.parent_package.MyAlarmReceiver」 – tricknology

0

將上述溶液不是我一直在尋找對..但是,有人遇到了像我一樣的問題(我正在使用短路徑):

把它放入您的AndroidManifest.xml之前</application>

<receiver android:name="com.path.to.your.receiver.MyAlarmReceiver" android:exported="false" android:process=":remote" > <intent-filter> <action android:name="com.socialparc.TIMES_UP" /> </intent-filter> </receiver>

「path.to.your.receiver」 可能是com.example.MyAlarmReceiver ..取決於你選擇,你創建或重新創建報警

相關問題