取消在重新启动完成时启动的类中启动的警报

时间:2014-02-26 07:36:38

标签: android alarmmanager android-context reboot

这是我的课程,它会在重新启动手机时启动并设置闹钟。

public class NotifStart extends BroadcastReceiver
{

private static AlarmNotif reAlarm = new AlarmNotif();

@Override
public void onReceive(Context context, Intent intent)
{


    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
    {
        reAlarm.SetAlarm(context.getApplicationContext());

    }
}

}

这是我的闹钟接收器类:

public class AlarmNotifReceiver extends BroadcastReceiver {

PendingIntent pi;

@Override
public void onReceive(Context context, Intent intent)
{
//stuff
}

public void SetAlarm(Context context)
{
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, AlarmNotifReceiver.class);
    pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10*1000, pi); // Millisec * Second
}

public void CancelAlarm(Context context)
{
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    am.cancel(pi);
}


}

现在,如果我在手机打开时使用SetAlarm(),我可以使用CancelAlarm()并实际取消它。但是每当我重启手机并使用上述课程NotifStart设置闹钟时,我无法取消它。我试图在NotifStart中使用cancel方法,但由于我无法将非活动类的上下文设为onReceive,因此它无效。

2 个答案:

答案 0 :(得分:2)

来自文档:

BroadcastReceiver对象仅在调用onReceive(Context,Intent)期间有效。一旦您的代码从此函数返回,系统会认为该对象已完成且不再有效。

因此,当您致电CancelAlarm时,您的待处理意图可能是null或不等于用于设置闹钟的未决意图。

答案 1 :(得分:1)

在CancelAlarm(上下文上下文)中,您的pi可能为null,请在执行取消之前使用相同的requestCode检查并重新创建它。

    public void CancelAlarm(Context context)
{
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, AlarmNotifReceiver.class);
    pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
    am.cancel(pi);
}