我已經在服務上設置了重複警報,並且決定從被叫服務中重置警報是最方便的。原因是該服務已經有代碼來檢查它是否在用戶定義的時間表(時間範圍)內。當它超出時間範圍時,它會重置鬧鐘,以在用戶選擇的將來時間開始。也許我正在接近這個錯誤,但我會把這個問題放在那裏,看看你的想法。Android:重置AlarmManager中的重複呼叫服務
//Activity
Calendar cal = Calendar.getInstance();
Intent intent = new Intent(getApplicationContext(), MyService.class);
intent.setData(Uri.parse("MyService://identifier"));
PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
intervalInMins*60000, pIntent);
的服務有這樣的事情:
的活動創建一個重複報警揭開序幕服務
//Service
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Uri Action = intent.getData();
try {
if (Action.equals(Uri.parse("MyService://identifier"))) {
//Simplifying the code here: CalculatedOffset is determined from the current time
//and scheduled start time. intervalInMins is read from settings.
if (!WithinSchedule()) {
Calendar cal = Calendar.getInstance();
PendingIntent pIntent = PendingIntent.getService(getApplicationContext(), 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + CalculatedOffset,
intervalInMins*60000, pIntent);
}
}
} catch (NullPointerException np) {
np.printStackTrace();
}
return Service.START_REDELIVER_INTENT;
}
我希望重新使用意圖重置重複報警。有了這個新的代碼,我看到在開始時間到來時連續快速發出多個警報。它不應該像這樣出現,但應該像調度重置之前那樣定期開火。我需要在調試器中捕獲它,但尚未能確定確切的條件。我的理解完全是基於這裏的警報嗎?有一個更好的方法嗎?
附錄:此處的一個摺痕是我使用RootTools獲得超級用戶權限,以便解決Android 4.2的飛行模式。這在調度之前並沒有出現問題,但是當警報疊加時,su是否阻塞了很長時間,我很懷疑。
我想知道,在更換重複警報時,創建PendingIntent時是否需要使用PendingIntent.FLAG_CANCEL_CURRENT?我一直在使用0。 – pmont