AlarmManager 立即执行我的 PendingIntent 而不是等待特定时间

AlarmManager executes my PendingIntent immediately instead of waiting for sertain time

我正在尝试实现警报,因此我的应用程序有 2 个活动:主要活动(用户设置警报的地方)和 'ringing' 实际触发警报时显示的活动。以下是我如何发送 AlarmManager 的意图来调用 'ringing' window:

public void scheduleAlarm(View view) {
    Intent intent = new Intent(this, WakeUp.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent wakeUp = PendingIntent.getActivity(this, 123, intent, 0);
    AlarmManager alarmManager = (AlarmManager) this.getSystemService(this.ALARM_SERVICE);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calculateMillis(), wakeUp); // setExact is pretty much made for setting alarms anyway
}

private long calculateMillis() {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, hour);
    cal.set(Calendar.MINUTE, minute);
    cal.set(Calendar.SECOND, 0);
    return cal.getTimeInMillis() - Calendar.getInstance().getTimeInMillis();
}

在我的清单中有以下内容:

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".WakeUpWithMath"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".WakeUp"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/title_activity_wake_up"
        android:theme="@style/FullscreenTheme" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
        </intent-filter>

    </activity>
</application>

我已经多次测试它并使用不同的 calculateMillis 值(甚至模拟到 return 30000)但结果总是相同的:在调用 alarmManager.setExact 之后它显示 'ringing' activity 一开始不等时间过去。

我错过了什么?清单配置错误吗?我需要使用 <receiver> 标签吗?如果可以,我该如何配置?

setExact 使用绝对时间,而不是相对时间。使用 cal.getTimeInMillis() 返回的时间而不减去当前时间。