2011-04-19 66 views
10

你好 我正在寫一個Android小工具;我想每隔1-5分鐘更新一次以監控來自webservice的數據,但是我發現android:updatePeriodMillis不能少於30分鐘....我怎樣才能獲得這個結果的Widget?每1分鐘更新一次android小工具

感謝和問候 c。

回答

16

爲每1分鐘呼叫註冊一次AlarmManager服務。

final Intent intent = new Intent(context, UpdateService.class); 
final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0); 
final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarm.cancel(pending); 
long interval = 1000*60; 
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),interval, pending); 

但是,將更新推送到應用程序小部件是一項昂貴的操作。每1分鐘更新一次會迫使你的「更新應用程序小部件」代碼駐留在內存中,這將永遠持續運行,這也會使電池消耗極大。

+0

我們應該把這個代碼放在哪裏?作爲一個Android初學者,它不會幫助我... – Virthuss 2015-12-14 04:34:46

+0

這是應該放在'onUpdate'方法嗎? – natsumiyu 2016-08-31 09:36:19

+1

這對於Android 6.0+無法正常工作。 打盹模式通常不適用於'setRepeating()'。我嘗試了一切,即使是'setExactAndAllowWhileIdle()',每當鬧鐘響起時,它都不會關閉,或者在我想要的1分鐘後關閉太多時間。 – Nikiforos 2017-02-13 10:13:17

1

使用HandlersendMessageDelayed(..)消息或postDelayed(..) a Runner

new Handler().postDelayed(new Runnable() { 
    public void run() { ... }, 
    60000 /* one minute */ 
); 
+1

接受的答案在這裏:http://stackoverflow.com/questions/5671984/android-substuting-the-click-with-a-timer/5672264#5672264給出了一個很好的例子,使用Handler和postDelayed – Maximus 2011-04-19 19:30:34

+0

This假設你有不斷運行的代碼將會更新應用部件。這是一個有缺陷的假設或一個非常糟糕的主意。 – CommonsWare 2011-04-19 20:20:59

+1

如果用戶的意思是桌面小部件,如android.appwidget類,那麼是的,我同意,Priyank的答案是正確的。但是,如果用戶意味着自定義視圖,例如android.widget類中的某些東西,那麼這意味着附加到Activity的View樹,這是我原來的假設。 (爲什麼哦,他們爲什麼會過載「小部件」的名字?) – Anm 2011-04-19 22:31:16