1

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

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 值(甚至模拟返回 30000)但结果始终相同:在调用alarmManager.setExact它之后立即显示“响铃”活动,并且不等待时间过去。

我错过了什么?清单配置错了吗?我需要使用<receiver>标签吗?如果是这样,我应该如何配置它?

4

1 回答 1

3

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

于 2015-04-22T23:36:46.377 回答