如Android開發者指南所述,如果您希望小部件更新頻率更高,您應該使用AlarmManager
來設置不喚醒設備的警報。使用AlarmManager手動更新小部件
原則上:不要使用AppWidgetProvider
類提供的標準機制,並且可以在xml文件中使用android:updatePeriodMillis輕鬆設置。
我很抱歉問,但指南只是聲明「使用AlarmManager,使用RTC
或ELAPSED_REALTIME
,...」但我真的發送意圖只更新我的小部件是失蹤!
有沒有人請說明我需要的代碼來形成模仿默認行爲的PendingIntent
?我不知道如何獲取小部件ID,我應該使用哪些動作等等......悲傷的開發指南在那一刻停止解釋! 需要什麼作爲額外的行動?
如果有人感興趣,我爲什麼要更新頻率超過30分鐘:我的小部件會顯示下一班車何時離開車站。每20分鐘有一輛公共汽車,所以我有兩個選擇:每分鐘更新一次小部件,顯示下一班車的出發時間(這就是我想要的!),或者不是那麼好,說明下一班車的出發時間所以我必須至少每20分鐘更新一次!
現在:當設備處於睡眠狀態時,當然這應該永遠不會喚醒它 - 所以我在開發指南中對此部分的理解是,這是實現它的正確方法;有人認爲我錯了嗎? 噢,另一件我想知道的事情是:如果設備在睡眠時更新,並且由於睡眠設備而沒有發出鬧鐘,它會在醒來時立即更新。
感謝您的幫助!
PS:我真的不知道爲什麼一個小部件提供程序的xml定義不允許通過布爾開關簡單地聲明「不要喚醒設備」......這將使生活變得如此簡單!無論如何,什麼樣的小部件需要喚醒設備? ;-)
這是多遠我走到現在,但它不工作 - 什麼也沒有發生:
private void startAlarm(Context pContext) {
Log.d(TAG, "startAlarm");
AlarmManager am = (AlarmManager) pContext.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
intent.setClass(pContext, getClass());
PendingIntent pi = PendingIntent.getBroadcast(pContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, pi);
}
最大的問題是,我真的不明白的地步「記住」當前控件的ID。 `onUpdate`獲得的ID數組並不總是完整列表;當添加一個新的窗口小部件時,它甚至會被這個單一的新ID調用。在配置對話框正確地以「OK」按鈕結束之前,或者像這樣!爲什麼???另外,看到小部件被踢出去的唯一方法是在`onDelete` - 但現在它不起作用。提供者一遍又一遍地被實例化 - 我應該使用首選項來存儲已知的窗口小部件ID嗎? – Zordid 2011-02-13 17:36:05