繁体   English   中英

为什么我的闹钟早于我的设定时间被解雇?

[英]Why my Alarm is fired earlier than my set time?

我正在尝试制作一个警报应用程序,它将在用户定义的日期和时间静音所有音量。 但是,警报似乎没有在正确的时间触发。 我发现警报总是提前解雇。

这是我设置的警报代码:

public static void setAlarm(Context context, String time, int day, int reqCode) {
    String[] timeSplit = time.split(":");
    Calendar calendar = Calendar.getInstance();

    int hour = Integer.parseInt(timeSplit[0]);
    int minute = Integer.parseInt(timeSplit[1]);
    int days = (day-calendar.get(Calendar.DAY_OF_WEEK) + calendar.get(Calendar.DAY_OF_MONTH));

    calendar.set(
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            days,
            hour,
            minute,
            0
    );

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, RuleAlarm.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, reqCode, intent, 0);

    // Set the alarm to be fired every week on the selected day
    alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 7 * 24 * 60 * 60 * 1000, pendingIntent);

    Toast.makeText(context, "Alarm is set", Toast.LENGTH_SHORT).show();
}

我试图将setRepeating()更改为setInexactRepeating()但没有改变。

尝试这个

alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 7 * 24 * 60 * 60 * 1000, pendingIntent);

问题是,如果您为过去的警报创建PendingIntent ,它将立即被触发。如果您想要防止这种情况发生,那么就不要设置过去触发时间的警报。 使用BroadcastReceiver接收警报。

更新:

检查我们是否在过去设置它会触发它立即触发

    if(calendar.getTimeInMillis() < System.currentTimeMillis()) {
    calendar.add(Calendar.DAY_OF_YEAR, 7);
    }

AlarmManger通过组合唤醒呼叫来节省电池是不精确的。 https://developer.android.com/reference/android/app/AlarmManager.html

屏幕截图来自https://developer.android.com/reference/android/app/AlarmManager.html

我终于找到了问题所在。 它位于day 我传递给day params的是我的Spinner选择的位置,从Calendar开始,而Calendar日期从1开始(SUNDAY = 1,MONDAY = 2,依此类推)。 因此,警报将始终在过去几天设置。 我加上day参数并且它有效。

这是我调用startAlarm()函数的代码片段。

String ruleStartTime = rule_startTime.getText().toString();

// Spinner index starts from zero,
// to match with the Calendar day indexing, we need to plus it one
int dayIdx = day.getSelectedItemPosition()+1;

Alarm.setAlarm(getApplicationContext(), ruleStartTime,
                        dayIdx, 0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM