6

我有这个代码

Calendar c = new GregorianCalendar();
        c.add(Calendar.DAY_OF_YEAR, 1);
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 22);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        // We want the alarm to go off 30 seconds from now.
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 30*1000;
        long a=c.getTimeInMillis();

        // Schedule the alarm!
        AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                c.getTimeInMillis(), 1*60*60*1000, sender);

23:22不执行

我做错了什么?我注意到 firstTime 和 c.getTimeInMillis() 在大小和长度上差别很大。当我使用 firstTime 时,设置为 30 秒时,警报执行得很好。

4

3 回答 3

11

您正在使用AlarmManager.ELAPSED_REALTIME_WAKEUP标志,但您正在使用日历对象。这两件事不能放在一起。

您需要使用AlarmManager.RTC,或者AlarmManager.RTC_WAKEUP如果您使用日历或日期对象指定闹钟时间(自 1970 年以来的毫秒数)。

您使用AlarmManager.ELAPSED_REALTIMEAlarmManager.ELAPSED_REALTIME_WAKEUP当您通过SystemClock.elapsedRealtime()(手机启动后的毫秒数)指定闹钟时间。

于 2010-06-07T21:09:25.190 回答
8

如果您只想为下一次出现 hh:mm 设置警报,我已成功使用以下代码

Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(System.currentTimeMillis());
    cal.set(Calendar.HOUR_OF_DAY, 22);
    cal.set(Calendar.MINUTE, 19);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    //check if we want to wake up tomorrow
    if (System.currentTimeMillis() > cal.getTimeInMillis()){
        cal.setTimeInMillis(cal.getTimeInMillis()+ 24*60*60*1000);// Okay, then tomorrow ...
    }
于 2010-09-02T22:22:21.340 回答
4

要让闹钟在 30 秒后响起,请使用

Calendar cal = Calendar.getInstance();

获取当前时间,然后

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+30000, sender); 

编辑:

我认为问题在于 ELAPSED_REALTIME_WAKEUP。这告诉 AlarmManager 你给它的时间是基于系统启动后的时间。从现在开始的 30 秒内都可以,但如果您希望它基于实时,您应该使用 RTC 或 RTC_WAKEUP。有关这些类型的完整说明,请参阅javadoc

于 2010-06-07T20:35:24.827 回答