我目前正在開發一個使用Android的AlarmManager的應用程序。我試圖向AlarmManager添加一個新的警報,但經過幾個小時的嘗試,並檢查了各種線程後,我仍然處於一堵磚牆。我的代碼有問題嗎?AlarmManager不添加新的鬧鐘,或沒有觸發接收器
主要活動 - saveAlarm()函數
/**
* Saves the current alarm. Adds to the database if it doesn't already exist, or updates if it does.
* Also sets alert with AlarmManager.
*/
public void saveAlarm() {
// Create Database instance
DbHandler db = new DbHandler(getApplicationContext());
if(alarm.getId() == -1) {
// Saving a new alarm
db.open();
alarm.setId(db.addAlarm(alarm));
db.close();
}
else {
db.open();
db.updateAlarm(alarm);
db.close();
}
// Create the wakeup intent
Intent intent = new Intent(this, AlarmReceiver.class);
intent.putExtra("alarm_id", alarm.getId());
// Create the Pending Intent
PendingIntent sender = PendingIntent.getBroadcast(this, AlarmPlayer.REQUEST_ALARM + alarm.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Debug
Calendar now = Calendar.getInstance();
long dTime = alarm.getNextAlarmTime().getTimeInMillis() - now.getTimeInMillis();
Log.d(TAG, "Setting alarm for " + (dTime/1000) + " seconds time");
// Add to Android Alarm Manager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, alarm.getNextAlarmTime().getTimeInMillis(), sender);
}
我已驗證正確的時間被傳遞到am.set(見上面調試部分)。
AlarmReceiver.class
/**
* This class listens out for broadcasts from AlarmManager
* and launches the AlarmPlayer activity accordingly.
* @author Michael
*
*/
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent intent) {
Log.d("RSS Alarm", "Waking up alarm");
// Launch the AlarmPlayer activity
Intent i = new Intent(c, AlarmPlayer.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
c.startActivity(i);
}
}
我也有[接收機機器人:過程= 「:遠程」 機器人:名稱= 「AlarmReceiver」/] (具有成角度的替換方括號)在AndroidManifest.xml中設置。我不知道是什麼導致了這個問題,但是它仍在發生。任何幫助將不勝感激,非常感謝提前。
編輯1 更改時區爲UTC似乎並沒有解決任何問題,我的日曆似乎默認爲UTC不管。當前代碼:
// Debug
Calendar now = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
long dTime = alarm.getNextAlarmTime().getTimeInMillis() - now.getTimeInMillis();
Log.d(TAG, "Setting alarm for " + (dTime/1000) + " seconds time");
// Add to Android Alarm Manager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Log.d(TAG, "Timezone offset is " + TimeZone.getDefault().getRawOffset());
Log.d(TAG, "UTC time is currently " + Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis()/1000);
am.set(AlarmManager.RTC_WAKEUP, (alarm.getNextAlarmTime().getTimeInMillis() - TimeZone.getDefault().getRawOffset()), sender);
不工作恐怕。事實證明,我的日曆默認爲UTC,無論如何(使用下面的編輯1中的代碼進行調試,將給出消息「Timezone offset is 0」)。雖然這是你提出的一個很好的觀點(謝謝),但它並不能解決這個問題。 –
好吧,值得一試,因爲我在這裏看到了幾個問題,其中涉及到UTC要求的問題。我能想到的另一件事(也應該提到)也在考慮夏時制 - 區域設置的時區偏移是恆定的,並且不隨DST變化而變化。如果那不是罪魁禍首,那麼我想不出別的什麼,對不起。 – Squonk
是的,原來是一個時間計算問題。剛剛重寫了'AlarmManager.set(..'部分,現在一切正常,乾杯。 –