我有一个appwidget,其中包含一个stackview。除了appwidget,我还有一个服务,当用户将我的appwidget添加到他们的主屏幕时,该服务就会启动,该主屏幕每两小时轮询一次新数据。当服务发现新数据时,我需要它通知我的appwidget,并将该数据传递给remoteviewsservice(它有我的remoteviewsfactory),以便它可以为新数据创建必要的视图。
目前,当服务发现新数据时,我让它向我的appwidget广播发现了新数据,并将该数据作为intent中的整数数组传递。
我的appwidgetprovider中的onreceive方法提取出该数据,然后我完成设置新意图的过程,该意图将传递给appwidget的remoteviews。示例代码如下:

public void onReceive( Context context, Intent intent )
{
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds( new ComponentName( context,  SampleAppWidgetProvider.class ) );

    int[] sampleData = intent.getIntArrayExtra( Intent.EXTRA_TITLE );
    for ( int i = 0; i < appWidgetIds.length; i++ )
    {
        // RemoteViewsFactory service intent
        Intent remoteViewsFactoryIntent = new Intent( context, SampleAppWidgetService.class );
        remoteViewsFactoryIntent.putExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i] );
        remoteViewsFactoryIntent.setData( Uri.parse( remoteViewsFactoryIntent.toUri( Intent.URI_INTENT_SCHEME ) ) );
        remoteViewsFactoryIntent.putExtra( Intent.EXTRA_TITLE, sampleData );

        RemoteViews rv = new RemoteViews( context.getPackageName(), R.layout.widget_layout );

        // Sync up the remoteviews factory
        rv.setRemoteAdapter( appWidgetIds[i], R.id.sample_widget, remoteViewsFactoryIntent );
        rv.setEmptyView( R.id.sample_widget, R.id.empty_view );

        appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
    }

    super.onUpdate( context, appWidgetManager, appWidgetIds );
}

这是第一次。数据由RemoteViewsService/RemoteViewsFactory显示。后续的新数据未命中RemoteViewsFactory的构造函数,因为该工厂的服务已在运行。
如何更新数据?我觉得我应该使用ondatasetchanged,但是如何访问从appwidget的onreceive传递的意图呢?
我很感激你对如何妥善处理这件事有什么见解。谢谢。

最佳答案

我对传递给RemoteViewsFactory的整数数组的解决方案是使用BroadcastReceiver解决的。我扩展了remoteviewsfactory来实现broadcastReceiver(特别是onReceive),并在工厂的构造函数中将其注册到我的应用程序中(这也意味着我在onDestroy中取消了注册)。这样,我就可以用appwidgetprovider的onreceive中的整数数组广播意图,并在remoteviewsfactory中接收它。
请确保还调用appwidgetmanager的notifyappwidgetviewdatachanged,以便remoteviewsfactory知道它以前使用的数据已失效,并显示一个新的整数数组以从中创建新的remoteviews。

07-24 09:21