我让用户设置重复闹钟的开始和结束时间,例如每天下午2:30至4:30。我可以将闹钟设置为在指定的开始时间关闭但是如何在结束时停止?
我想我应该在广播接收器类中处理这个,我得到额外的并将它与系统时间进行比较,但我不能在这里取消警报,就像我在活动中取消它一样。
这是我如何设置闹钟的示例:
Intent intent = new Intent(NewSchedule.this, RepeatingAlarm.class);
intent.putExtra("endTime", cal_alarmend.getTimeInMillis()/1000);
PendingIntent sender = PendingIntent.getBroadcast(NewSchedule.this, REQUEST_CODE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal_alarmstart.getTimeInMillis(), 6000, sender);
接收者类:
public class RepeatingAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "repeating_received", Toast.LENGTH_SHORT).show();
long now = System.currentTimeMillis();
Bundle b = intent.getExtras();
long end = b.getLong("endTime");
Log.i("now", now + "");
Log.i("end", end + "");
if (now > end)
{
???????
}
}
}
修改
为什么我不能在BroadcastReceiver的onReceive()中取消闹钟?
public class RepeatingAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "repeating_received", Toast.LENGTH_SHORT).show();
long now = System.currentTimeMillis();
Bundle b = intent.getExtras();
long end = b.getLong("endTime");
int rc = b.getInt("reqCode");
Log.i("rc", rc + "");
long n = now/1000;
long e = end;
Log.i("now", n + "");
Log.i("end", e + "");
if (n > e)
{
Log.i("STATUS", "now > end " + n + ">" + e);
Intent intentstart = new Intent();
PendingIntent senderstart = PendingIntent.getBroadcast(context, rc, intentstart, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
am.cancel(senderstart);
}
else
{
Log.i("STATUS", "now <= end " + n + "<=" + e);
}
}
}
我仔细检查了堆栈跟踪,而rc与我用于启动警报的请求代码完全相同。
这是堆栈跟踪:
此后,警报应该被取消,但我仍然收到Toast消息。
答案 0 :(得分:2)
我不能在这里取消警报,就像我在活动中取消它一样
AFAIK,你可以。更确切地说,我看不出会出现什么问题。
这就是我在活动中取消闹钟的方法
该代码设置了警报。它没有取消它。要取消闹钟,请在等效PendingIntent
(除临时演员之外的所有内容)上创建具有相同类型(例如getBroadcast()
)的Intent
,并在cancel()
上调用AlarmManager
{1}}。