1

我让用户设置重复警报的开始和结束时间,例如每天下午 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 消息。

4

1 回答 1

2

我无法像在活动中取消它一样在此处取消警报

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

这就是我在活动中取消警报的方式

该代码设置了警报。它不会取消它。要取消警报,请在等效项(除附加项之外的所有内容)上创建具有相同类型PendingIntent(例如)的 ,然后调用.getBroadcast()Intentcancel()AlarmManager

于 2012-10-14T14:10:22.850 回答