第一次添加时,AppWidget没有完成更新

时间:2012-10-07 00:55:01

标签: android android-intent appwidgetprovider android-appwidget

编辑:我安装了我的应用4.x设备,没有问题。问题仅存在于3.x设备中。

我正在尝试在用户设置时手动更新AppWidget 设备上的更改。为此,我使用与此类似的代码:

ComponentName thisWidget = new ComponentName(this, MyAppWidget.class); 
AppWidgetManager manager = AppWidgetManager.getInstance(this); 
manager.updateAppWidget(thisWidget, updateViews);

我可以告诉我,我的AppWidget onUpdate方法被调用为 因为我在代码中将一些调试字符串记录到logcat。然而 AppWidget本身不会在屏幕上更改。

这是一个有趣的部分:如果我旋转我的设备并强制一个 刷新主屏幕(从PORTRAIT到LANDSCAPE,反之亦然) 最后我的AppWidget得到了更新。然而旋转设备 不会触发onUpdate方法被调用,所以AppWidget 必须使用早期更新中提供的RemoteView。

有人可以解释一下如何强制重写主屏幕 我的AppWidget处理更新时?

我正在使用<uses-sdk android:minSdkVersion="11" />

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

  // Get all ids
  ComponentName thisWidget = new ComponentName(context, MyProvider.class);
  int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
  // Build the intent to call the service
  Intent intent = new Intent(context.getApplicationContext(), MyService.class);
  intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);

  RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);

  appWidgetManager.updateAppWidget(appWidgetIds, views);

  // Update the widgets via the service
  context.startService(intent);
}

我的服务:

@Override
public void onStart(Intent intent, int startId) {
    Log.i(LOG, "Called");

    this.appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext());

    this.allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

    ComponentName thisWidget = new ComponentName(getApplicationContext(), MyProvider.class);
    int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget);
    Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length));        
    Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length));
    config = getResources().getConfiguration();

    for (int widgetId : allWidgetIds) {
        //do things like starting ASYNCs (couple of them) to fetch data from server
        //and set an adapter for the gridview
    }   

    Intent intentOpen = new Intent(getApplicationContext(), MainFragmentActivity.class);
    PendingIntent open = PendingIntent.getActivity(getApplicationContext(), 0, intentOpen, 0);
    remoteViews.setOnClickPendingIntent(R.id.widget_whole, open);
    remoteViews.setViewVisibility(R.id.widgetProgress, View.GONE);
    appWidgetManager.updateAppWidget( thisWidget, remoteViews );    
    Log.d(LOG, "sent!!");       
}
stopSelf();

super.onStart(intent, startId); }

2 个答案:

答案 0 :(得分:0)

这听起来像是发射器应用程序中的一个错误。每当您致电updateAppWidget时, AppWidgetManager 都会收到新的布局,并且启动器负责使用这种新布局重新绘制小部件。

当屏幕旋转onUpdateupdateAppWidget时未调用,但启动器使用新布局重新绘制窗口小部件意味着 AppWidgetManager 已成功收到新版面。

当屏幕旋转时,启动器被强制重绘所有内容(重新创建其活动),这就是它显示新布局的原因。

此错误可能已在Android 4.0 +中修复

答案 1 :(得分:-1)

我会尝试在您的小部件中的视图上调用invalidate()。调用强制系统重绘View。