这是我的课程,它会在重新启动手机时启动并设置闹钟。
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
,因此它无效。
答案 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);
}