如何正确使用AlarmManager类以固定的时间间隔执行任务?

时间:2014-05-16 05:32:44

标签: android service alarmmanager

我正在尝试创建一个必须以固定间隔执行某项任务的应用。经过大量研究和尝试后,我认为最好使用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();
}

2 个答案:

答案 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...........");

试着帮助你。