4

如Android開發者指南所述,如果您希望小部件更新頻率更高,您應該使用AlarmManager來設置不喚醒設備的警報。使用AlarmManager手動更新小部件

原則上:不要使用AppWidgetProvider類提供的標準機制,並且可以在xml文件中使用android:updatePeriodMillis輕鬆設置。

我很抱歉問,但指南只是聲明「使用AlarmManager,使用RTCELAPSED_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); 
} 

回答

1

有誰請註明代碼,我需要形成的PendingIntent模仿默認行爲?

我不會,因爲AFAIK不可能精確地「模仿默認行爲」。只要有AlarmManager報警使用PendingIntent,要麼發送一個自定義操作,您AppWidgetProvider您在onReceive()處理,或呼籲IntentService你正在使用你的應用程序窗口小部件背後的真正智慧startService()

我沒有線索如何讓小部件IDS

你從實際onUpdate()調用,如當應用程序widget被首次提出在屏幕上保存的小部件的ID。當鬧鐘響起時,更新所有應用程序小部件。

更新每分鐘的小部件,顯示下一班車的發車時間(這就是我想要的!)

請允許這是用戶可配置的。

哦,我想找出另一件事:如果設備處於睡眠狀態時,窗口小部件應進行更新和我的鬧鐘是不是由於休眠設備發出的,將它即時更新,當它醒來? ??

AFAIK,是的,但我沒有使用不是_WAKEUP變種的報警。

+0

最大的問題是,我真的不明白的地步「記住」當前控件的ID。 `onUpdate`獲得的ID數組並不總是完整列表;當添加一個新的窗口小部件時,它甚至會被這個單一的新ID調用。在配置對話框正確地以「OK」按鈕結束之前,或者像這樣!爲什麼???另外,看到小部件被踢出去的唯一方法是在`onDelete` - 但現在它不起作用。提供者一遍又一遍地被實例化 - 我應該使用首選項來存儲已知的窗口小部件ID嗎? – Zordid 2011-02-13 17:36:05