2016-03-07 39 views
0

我想要一個android應用程序小部件來定期更新。我使用了Handler來達到這個目的,因爲我希望它更頻繁地更新(一分鐘一次)。在onEnabled()上聲明Handler的調用按預期工作。但有時會失敗。該小部件不升級,並通過日誌記錄,我發現Handler成爲null。所以我宣佈Service來更新小部件並宣佈Handler並用它更新。現在我所有的小部件都是在onEnabled()呼叫中啓動服務,並在onDisabled()呼叫上停止它。 Service始終運行並更新小部件。代碼:使用服務處理程序更新應用程序小部件

public void onCreate() { 
    super.onCreate(); 
    handler=new Handler(); 
    runnable=new Runnable() { 
     @Override 
     public void run() { 
      ComponentName appWidget=new ComponentName(getApplicationContext().getPackageName(),widget.class.getName()); 
      AppWidgetManager widgetManager= AppWidgetManager.getInstance(getApplicationContext()); 
      int ids[]=widgetManager.getAppWidgetIds(appWidget); 
      for(int id:ids) 
      { 
       RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widgetLayout); 
//Update Widget here      
     widgetManager.updateAppWidget(id, views); 
      } 
      handler.postDelayed(runnable, delay); 
     } 
    }; 
} 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    handler.post(runnable); 
    return super.onStartCommand(intent, flags, startId); 
} 

這是更新窗口小部件的最佳方法嗎?因爲這意味着用戶可以使用任務殺手來終止該服務,這將導致該小部件無法正常工作,並且如果該設備重新啓動,則該服務將不會運行。那麼如何擺脫這個並更新小部件?還是有一種更有效的方式來非常頻繁且可靠地更新小部件?謝謝。

回答

0

爲了更確定您不會遇到您描述的不當行爲,您應該將其從您的進程中移除,並讓其他組件處理更新間隔。 AlarmManager有一個功能,可以爲你做這個:public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)

您可以使用它像這樣

AlarmManager aManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
aManager.setRepeating(/*clock_type*/, /*first trigger*/, /*update time*/, /*action*/); 

您可以在這裏找到的文檔:http://developer.android.com/reference/android/app/AlarmManager.html

通過移動你想要的AlarmManager的功能,如果您的應用程序就會被殺死也沒關係。因爲AlarmManager會送你一個新的Intent你的過程將被帶回生活和你的小工具將繼續同時正常工作

,如果你正在使用窗口小部件,你可能想看看AppWidgetProviderhttp://developer.android.com/reference/android/appwidget/AppWidgetProvider.html)。它專門用於創建和控制部件

+0

感謝您的回答。我已經嘗試使用小部件中的'AlarmManager'。它的工作,但它也有時失敗,我的小部件被凍結。這就是爲什麼我使用Handler。 –

+0

只要對AlarmManager進行調用,我認爲不會有太大的區別。我很驚訝地聽到它有時會失敗 – 0xDEADC0DE

+0

是的。有時候我會看到這個小部件剛剛被凍結而沒有更新。即使當我使用處理程序從小部件內部進行更新時,也會發生這種情況。當我手動觸發配置活動的更新時,該更新將起作用。但不能與AlarmManager或處理程序。 –