2013-08-12 91 views
2

我有幾個小部件,其基本上都是我的應用程序內快速鏈接功能,的Widget UI不響應更新廣播

這些構件基本的ListView/GridView的其正在通過在主要改變的數據備份應用程序的執行。

由於數據的應用程序執行過程中不僅改變了更新頻率被設定爲這樣:

android:updatePeriodMillis="0" 

,並在數據改變了我火了以下內容:

public void updateWidget(@SuppressWarnings("rawtypes") Class provider) { 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
    int[] gridids = appWidgetManager.getAppWidgetIds(new ComponentName(this.getPackageName(), provider.getName())); 

    Intent intent = new Intent(this, provider); 
    intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,gridids); 
    sendBroadcast(intent); 
} 

我能在供應商的onReceive(),並從他們的呼叫更新機制趕上這樣的:

public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 
    Log.e(this.getClass().getSimpleName(), "onReceive()"); 
    int[] ids = intent.getExtras().getIntArray("appWidgetIds"); 
    for(int id : ids) onUpdateWithService(context, id); 
} 

protected void onUpdateWithService(Context context, int widgetId) {  
    super.onUpdateWithService(context, widgetId); 
    RemoteViews views = new RemoteViews(context.getPackageName(), getResourceLayout(context, widgetId));      

    Intent intent = new Intent(context, GridViewWidgetServiceAdapter.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 

    views.setRemoteAdapter(R.id.listView, intent); 
    views.setPendingIntentTemplate(R.id.listView, PendingIntent.getActivity(context, -1, new Intent(), PendingIntent.FLAG_UPDATE_CURRENT)); 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    appWidgetManager.updateAppWidget(widgetId, views); 
} 

我遇到的問題是,雖然代碼觸發並調用了updateAppWidget(),但小部件的UI不會更改。

我錯過了Widget更新中涉及的技巧嗎?

+0

還要記住的是,設置機器人:下面updatePeriodMillis 30分鐘不會將其設置爲該時間,它會自動回退到30分鐘。只能使用代碼覆蓋30分鐘的最小計時器。 – Milan

+0

@Milanix - 不根據[android文檔](http://developer.android.com/guide/topics/appwidgets/index.html) - 將其設置爲0將禁用自動更新。 – Graeme

+1

啊,錯過了,謝謝。無法停止學習:) – Milan

回答

2

This answer似乎解決了這個問題。

不知道爲什麼解決了這個問題,但它確實...

添加以下行的意圖工作正常

Intent intent = new Intent(context, GridViewWidgetServiceAdapter.class); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
intent.putExtra("Random", Math.random() * 1000); // Add a random integer to stop the Intent being ignored. 
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
+0

關於「不知道爲什麼它解決了問題,但它確實......」:Android似乎緩存了您在onUpdate方法中使用的意圖。此外,Remoteviews默認緩存。所以你需要每次發送不同的號碼。它類似於jQuery緩存的概念,您可以將jquery獲取爲「./jquery.js?v=somerandomnumebr」以避免緩存。 – ashutosh