2011-08-29 92 views
1

我目前正在開發一個使用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); 

回答

0

這可能是AlarmManager.set(AlarmManager.RTC_WAKEUP, ...)需要UTC時間的情況嗎?這會導致問題,如果您設置「本地時間」,並不適應UTC。簡而言之,可能會正確添加警報,但除非您的時區爲UTC,否則它不會在您期望時觸發。

從文檔...

公共靜態最終詮釋RTC_WAKEUP自:API級別在System.currentTimeMillis的1

報警時間()(以UTC掛鐘時間),這將當設備關閉時喚醒設備。

+0

不工作恐怕。事實證明,我的日曆默認爲UTC,無論如何(使用下面的編輯1中的代碼進行調試,將給出消息「Timezone offset is 0」)。雖然這是你提出的一個很好的觀點(謝謝),但它並不能解決這個問題。 –

+0

好吧,值得一試,因爲我在這裏看到了幾個問題,其中涉及到UTC要求的問題。我能想到的另一件事(也應該提到)也在考慮夏時制 - 區域設置的時區偏移是恆定的,並且不隨DST變化而變化。如果那不是罪魁禍首,那麼我想不出別的什麼,對不起。 – Squonk

+0

是的,原來是一個時間計算問題。剛剛重寫了'AlarmManager.set(..'部分,現在一切正常,乾杯。 –

0

在你的清單中,我相信你需要android:name「.AlarmReceiver」注意點。 如果不這樣做,請發佈您的清單文件。另外,您的logcat是否提到添加警報和警報觸發?

編輯:你可以試試這個 AlarmManager am =(AlarmManager)getSystemService(Context.ALARM_SERVICE);

除此之外,我沒有看到任何東西跳出來對我。好運

+0

這是這個問題更奇怪的方面之一 - 沒有提及AlarmManager或除Log日誌之外的任何類似的記錄I已經留在代碼中了,現在將張貼清單。 –