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()
返回的时间而不减去当前时间。
我正在尝试实现警报,因此我的应用程序有 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()
返回的时间而不减去当前时间。