如何设置特定时间段的警报

时间:2012-10-14 12:36:00

标签: android alarmmanager

我让用户设置重复闹钟的开始和结束时间,例如每天下午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与我用于启动警报的请求代码完全相同。

这是堆栈跟踪: enter image description here

此后,警报应该被取消,但我仍然收到Toast消息。

1 个答案:

答案 0 :(得分:2)

  

我不能在这里取消警报,就像我在活动中取消它一样

AFAIK,你可以。更确切地说,我看不出会出现什么问题。

  

这就是我在活动中取消闹钟的方法

该代码设置了警报。它没有取消它。要取消闹钟,请在等效PendingIntent(除临时演员之外的所有内容)上创建具有相同类型(例如getBroadcast())的Intent,并在cancel()上调用AlarmManager {1}}。