用于绑定集合的 Android Widget 服务类未被提供者调用
Posted
技术标签:
【中文标题】用于绑定集合的 Android Widget 服务类未被提供者调用【英文标题】:Android Widget Service Class to bind Collection not being Called By Provider 【发布时间】:2012-11-14 09:37:36 【问题描述】:请多多包涵,因为我是 android 开发新手。
我正在构建一个小部件,该小部件在放置在主屏幕上时会打开一个配置活动。当我完成配置并按下“完成”时,小部件提供程序 (onUpdate) 应该调用小部件服务类以将可绘制列表绑定到网格视图。但是,服务类没有被调用,gridview 是空的。对此的任何帮助表示赞赏,代码包含在下面:
*注意:我有一个 main.xml,其中包含 gridview,另一个 xml 包含模板(imageView 和 textView)gridview 单元格。
清单:
<service android:name=".WidgetService" android:permission="android.permission.BIND_REMOTEVIEWS" android:exported="false" />
<receiver android:name=".WidgetProvider" android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/button_widget_provider" />
</receiver>
提供者:
public class WidgetProvider extends AppWidgetProvider
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
for (int i=0; i < appWidgetIds.length; i++)
Intent intent = new Intent(context, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
remoteViews.setRemoteAdapter(appWidgetIds[i], R.id.gridview, intent);
appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
super.onUpdate(context, appWidgetManager, appWidgetIds);
......(omitted code)
服务:
public class WidgetService extends RemoteViewsService
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent)
return new VZRemoteViewsFactory(this.getApplicationContext(), intent);
class VZRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory
public VZRemoteViewsFactory(Context context, Intent intent)
thisContext = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
public void onCreate()
// code to add drawables to list here
public RemoteViews getViewAt(int position)
RemoteViews remoteView = new RemoteViews(thisContext.getPackageName(), R.layout.vzwidget_item);
// setting the image view resource this way for now just for testing
remoteView.setImageViewResource(R.id.launcher_icon, R.drawable.vzicon);
remoteView.setTextViewText(R.id.textview, "test");
return remoteView;
.....(omitted code)
谢谢!
【问题讨论】:
【参考方案1】:根据我的经验(并查看我自己刚刚编写的小部件)- OnUpdate 在配置活动启动时被调用,并且在您发布此活动的结果后,将以下意图操作提供给 appWidgetProvider - android. appwidget.action.APPWIDGET_UPDATE_OPTIONS(在 jellybean 上测试)。
这可能不是处理这个问题的最合适的方法,但这就是我处理这个问题的方式 - 当配置活动发布结果时 - 我启动我的远程视图服务并开始使用正确的 widgetid 发送视图。
【讨论】:
感谢您回答 Sagi!我按照您说的方式尝试了它,不幸的是它对我不起作用……但是您为我指明了正确的方向。谢谢! 当我经历这个时,我发现我的配置活动即使在设置结果之后也没有调用我的 OnReceive() 或 OnUpdate() 方法。我发现这个技巧在这里有效:link 很高兴它成功了!我个人认为在 WidgetProvider 中收听 onEnabled 是完成活动后更正确的方向 - 据我所知,活动启动时会定期调用 onUpdate。以上是关于用于绑定集合的 Android Widget 服务类未被提供者调用的主要内容,如果未能解决你的问题,请参考以下文章
Android--ListView与数据绑定(Xamarin)
用于内容的 Widget RemoteViewsFactory 中的 Android 权限拒绝