2012-06-02 90 views
6

我已經搜索了3天,但沒有在其他地方找到解決方案或類似問題/問題。這裏是處理:AlarmManager觸發PendingIntent太快

觸發在1個小時 - >工作的正確

觸發在2個小時 - >進去1:23

觸發以1天爲 - 在>去的〜11:00

那麼,爲什麼AlarmManager如此不可預測,並且總是太快?或者我做錯了什麼?還有另一種方式,以便它可以正常工作?

這是我在AlarmManager(精簡)註冊我的PendingIntent方式:

AlarmManager alarmManager = (AlarmManager)parent.getSystemService(ALARM_SERVICE); 
Intent myIntent = new Intent(parent, UpdateKlasRoostersService.class); 
PendingIntent pendingIntent = PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

//Set startdate of PendingIntent so it triggers in 10 minutes 
Calendar start = Calendar.getInstance(); 
start.setTimeInMillis(SystemClock.elapsedRealtime()); 
start.add(Calendar.MINUTE, 10); 

//Set interval of PendingIntent so it triggers every day 
Integer interval = 1*24*60*60*1000; 

//Cancel any similar instances of this PendingIntent if already scheduled 
alarmManager.cancel(pendingIntent); 

//Schedule PendingIntent 
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, start.getTimeInMillis(), interval, pendingIntent); 
//Old way I used to schedule a PendingIntent, didn't seem to work either 
//alarmManager.set(AlarmManager.RTC_WAKEUP, start.getTimeInMillis(), pendingIntent); 

這將是真棒,如果任何人有一個解決方案。謝謝你的幫助!

更新: 2個小時前,它的工作間隔爲2小時觸發它,但之後它在1:20小時後觸發。它變得非常奇怪。我將使用日誌文件跟蹤觸發器並在明天發佈。

更新: PendingIntent計劃每3小時運行一次。從日誌的第二行,似乎像一個老預定的PendingIntent仍在運行:

[2012-5-3 2:15:42 519] Updating Klasroosters 
[2012-5-3 4:15:15 562] Updating Klasroosters 
[2012-5-3 5:15:42 749] Updating Klasroosters 
[2012-5-3 8:15:42 754] Updating Klasroosters 
[2012-5-3 11:15:42 522] Updating Klasroosters 

但是,我敢肯定,我取消了預定的PendingIntent的之前,我安排一個新的。並且每個PendingIntent都不以相同的方式重新創建,因此它應該完全相同。如果沒有,這個線程問題不再相關。

+1

我無法重新創建您的問題。你究竟如何改變'開始'提前2小時,也是1天? – Sam

+1

我添加了日誌文件,發現可能舊的PendingIntent仍在運行。 – Wezelkrozum

+0

我也有同樣的問題,你有一個工作解決方案? – david

回答

1

使用日曆時,您會考慮日曆使用的時間正好低至毫秒。也許你應該將Milli秒域和秒域設置爲零,這樣它就會出現在點上。

而且一天它會更容易,當您使用的getInstance不設置該日曆的時間來創建它的時候使用這個

Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(0); 
cal.add(Calendar.DAY_OF_MONTH, 1); 

也是如此,不應該有任何需要再次設置時間?

+1

查看文檔,SystemClock.elapsedRealtime()是從手機啓動以來的時間,而不是實際的時間。此外,我不認爲setTimeInMillis(0)調用是必要的,因爲你需要從現在開始的1天,而不是從時代(這是很久以前)的1天。 –

+1

但我相信他將1天作爲間隔而不是實際時間? – FabianCook

+1

是的,但我假設這個問題是與使用'日曆'設置的觸發時間。 1天的時間間隔是使用Integer來定義的,應該沒問題。 –

1

重寫:我最終看到了你的錯誤,但無法預測。因爲你不知何故一個老意圖是廣播相同的假設下

PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

我沒有改變這一點:

PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

了這一點。我從來沒有見過僥倖...

也是我看到它的唯一時間是在我最初的電話。另一種方法是跟蹤currentprevious日曆對象,如果時間間隔不符合您的預期,則忽略此「早期」廣播。(雖然這種方法似乎是多餘的考慮如何報警應該工作,它有助於防止這些多餘呼叫考慮報警如何工作...)

希望幫助,我會讓你知道,如果我找到還要別的嗎。

+1

感謝您的努力,但我已經這樣做了。當我分析這些數據時,它應該準時觸發PendingIntent,但事實並非如此。所以,這就是問題所在。 – Wezelkrozum

+1

對不起,聽到這個......當你發佈新數據時給我加上標籤,如果可以的話,我會幫忙的。 – Sam

+1

我用日誌文件更新了問題 – Wezelkrozum

1

我知道這個問題有點老,但我自己也有這個問題。我發現,如果我試圖在方法之外聲明日曆變量,它將不會很好地播放,並且警報會提前觸發。因爲你的課程被剝奪了,所以很難確切地告訴你在哪裏調用日曆實例。

如果我將它設置成這樣的話,那就正確開火時間:

protected void nextAlarm(Context context, int seconds){ 
    Calendar nextAlarm = Calendar.getInstance(); 

    Intent intent = new Intent(context, MyClass.class); 
    PendingIntent pending = PendingIntent.getBroadcast(context, MainActivity.REPEATING_ALARM, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    AlarmManager amanager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    nextAlarm.add(Calendar.SECOND, seconds); 

    amanager.set(AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pending); 

} 
+1

說實話,我不是這個問題。我在該方法內創建了日曆。但是我們發現在檢索我們的PendingIntent方面有所不同。在使用getService方法時,您使用getBroadcast方法。 – Wezelkrozum

1

確保你的服務的onStartCommand返回START_NOT_STICKY,否則會被自動重新嘗試:

public class UpdateKlasRoostersService extends Service { 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     buildUpdate(); 
     return START_NOT_STICKY; 
    } 
} 
+1

這是否意味着我的服務繼續嘗試啓動? – Wezelkrozum