2013-08-12 41 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