我创建了一个Appwidget,它显示通过Uri提供给它的RemoteViews的图像文件(test.png)。
在onUpdate中,我运行了一项更改文件内容的服务。我还为将调用onUpdate的图像设置了onClickListener。

-如果创建AppWidget的实例,它将显示Uri文件的最新更改版本。

-如果单击窗口小部件,我的服务将对文件进行适当的更改(可以使用文件浏览器进行验证),但不会更新AppWidget中显示的图像。

-(最重要的是)如果我删除AppWidget并创建一个新的,它会显示图像文件的当前/正确版本。

我知道我的服务可能花了很长时间才能在第一遍生效,但是它应该在onUpdate的下一次onClick /调用中显示最新图像。
就目前而言,AppWidget仅显示在onUpdate的第一次调用中存在的图像文件的版本。

题:

刷新Appwidget的RemoteView内容的正确方法是什么,我的方法中是否缺少某些内容?

谢谢你的时间!

更新:

我已经尝试从AppWidgetProvider.onReceive()调用AppWidgetManager.notifyAppWidgetViewDataChanged()方法,但在onUpdate()之后仍未更改为RemoteViews内容。

public class CCWidgetProvider extends AppWidgetProvider {

  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)
    {

    // Get all ids
    ComponentName thisWidget = new ComponentName(context,CCWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

    for (int widgetId : allWidgetIds)
        {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_layout04);

        /*
         * it's here that I run a service that changes the content of the file /test/test.png
         */

        RelativeLayout RL_widget = new RelativeLayout(context);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        RL_widget = (RelativeLayout)inflater.inflate(R.layout.widget_main, null);

        Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/test/test.png");
        remoteViews.setImageViewUri(R.id.IV_widget_image,uri);


        Intent intent = new Intent(context, CCWidgetProvider.class);
        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        //PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.IV_widget_image, pendingIntent);

        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
 }
}

最佳答案

我发现有很多东西会使小部件变难。

答:onUpdate并不是真正的更新机制

与听起来相反,onUpdate仅在两种情况下被调用:


创建窗口小部件时。
每当更新周期时间(在小部件的xml定义文件中定义的updateMillis)过去时。


关键点:onUpdate从未在其他时间调用。 (据我在实践中所见)。

如果您希望小部件在其他时间更新,则有必要在了解小部件和要触发的能力的情况下创建一个单独的机制。通常,这是您在Service例程中启动的onUpdate。可能看起来像:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )
{
    // start the service in case it ain't started yet, this also force a widget update to ensure correct status on them
    Intent intent = new Intent(context, MyService.class);
    intent.putExtra('service.startCode', /*A number to identify what is going on*/);
    context.startService(intent);

    // Everything else is triggered from the service!!
}


然后,该服务会设置小部件的内容,并根据需要通过内部计时或使用Broadcast机制对其进行更新。

B.您不能真正更新小部件

创建小部件,然后在事物发生变化时更新remoteViews或其中的视图,这似乎是合乎逻辑的。以我的经验,这无法预期。如果要更改窗口小部件中的任何内容,请创建一个新的remoteViews,正确填写它,然后将其分配给窗口小部件。

关于android - AppWidget刷新Uri for RemoteViews,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25944639/

10-10 19:48