Android AlarmReceiver和BootReceiver

时间:2011-09-07 09:42:02

标签: android alarm reboot

在我的应用程序中,我创建了警报。因此,当手机重新启动时,我需要再次创建警报。

但是当我重新启动手机(模拟器)并且必须创建警报时,会有一个强制关闭。它说:

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 Class

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

它有效。

2 个答案:

答案 0 :(得分:0)

将完全限定名称提供给AlarmReceiver

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

检查AlarmReceiver类中的包名称。它应该只是这样

package com.yannv.vehiclesmanager;

答案 1 :(得分: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>

&#34; path.to.your.receiver&#34;可能是com.example.MyAlarmReceiver ..取决于您选择的文件结构