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 не меняется на экране.

А вот и интересная часть: если я поверну свое устройство и принудительно обновлю домашний экран (с ПОРТРЕТА на ЛАНДШАФТ или наоборот), то, наконец, мой AppWidget обновится. Однако вращение устройства не приводит к вызову метода onUpdate, поэтому AppWidget должен использовать RemoteViews, предоставленные в более раннем обновлении.

Может кто-нибудь объяснить мне, что делать, чтобы принудительно перерисовать главный экран моего 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); }

person erkangur    schedule 07.10.2012    source источник
comment
Можете ли вы добавить немного кода, может быть, вашу функцию onUpdate?   -  person Tim    schedule 10.10.2012
comment
Пишите журнал после каждой строки, чтобы вы могли отслеживать, где она останавливается. Я знаю, что onReceive работает всего 4 секунды, может быть, что-то подобное и с onUpdate   -  person Martin Vandzura    schedule 15.10.2012
comment
‹uses-sdk android:minSdkVersion=11 android:targetSdkVersion=16 /› щелкните правой кнопкой мыши проект, свойства, версия Android › 16   -  person Sandeep P    schedule 16.10.2012


Ответы (2)


Это звучит как ошибка в приложении запуска для меня. Каждый раз, когда вы вызываете updateAppWidget, AppWidgetManager получает новый макет, и программа запуска отвечает за перерисовку виджета с этим новым макетом.

Тот факт, что при повороте экрана onUpdate и updateAppWidget не вызываются, а программа запуска перерисовывает виджет с новым макетом, означает, что AppWidgetManager уже успешно получил этот новый макет. .

При повороте экрана лаунчер вынужден все перерисовывать (пересоздается его Activity) и поэтому показывает новый макет.

И эта ошибка, вероятно, исправлена ​​​​в Android 4.0+.

person ra3o.ra3    schedule 25.03.2014

Я бы попробовал вызвать invalidate() для представлений в вашем виджете. Вызов этого заставляет систему перерисовывать представление.

person boztalay    schedule 09.10.2012
comment
RemoteViews не имеет метода invalidate. - person erkangur; 09.10.2012
comment
К сожалению, notifyAppWidgetViewDataChanged() в AppWidgetManager может помочь. Он сообщает соответствующему представлению аннулировать его данные. - person boztalay; 09.10.2012
comment
нет не повезло с этим. Я уже использую функцию updateAppWidget. Пробовал notifyAppWidgetViewDataChanged() ничего не изменилось. - person erkangur; 09.10.2012