我正在尝试创建一个必须以固定间隔执行某项任务的应用。经过大量研究和尝试后,我认为最好使用AlarmManager类,因为它在内存和电池使用方面的效率,而不是在服务中运行计时器。
现在有些方面我有问题。
一个是我应该如何访问在之前运行时创建的警报对象才能取消它?
Intent intent = new Intent(getActivity(), MyService.class);
PendignIntent pintent = PendingIntent.getService(getActivity(), 0, intent, 0);
AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() +
20000, AlarmManager.INTERVAL_FIFTEEN_MINUTES, pintent);
有办法知道警报是否已设定,但它本身无法发出警报。
boolean alarmUp = (PendingIntent.getService(getActivity(), 0, new Intent(getActivity(), MyService.class), PendingIntent.FLAG_NO_CREATE) != null);
if(alarmUp){
//How to cancel the alarm
}else {
Toast.makeText(getActivity(), "Alarm not running", Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:1)
警报管理器中的注册和取消基于未决意图。如果使用相同的参数创建待定意图,则可以访问相同的警报。
答案 1 :(得分:1)
是的,您可以根据PendingIntent取消闹钟,如下所示 -
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
Intent alarmintent1=new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent sender1=PendingIntent.getBroadcast(SpeedMotors.this, 100, alarmintent1, PendingIntent.FLAG_UPDATE_CURRENT | Intent.FILL_IN_DATA);
try {
am.cancel(sender1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("ex....."+e);
}
Calendar cal=Calendar.getInstance();
cal.add(Calendar.SECOND, 5);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000*10, sender1);
System.out.println("alarm set...........");
试着帮助你。