1

У меня есть виджет приложения, который запускает намерениеУслуги по приему обновлений.Android App Widget - какой контекст для использования

Я не уверен, какой контекст использовать для того, чтобы обновить виджет, я должен использовать один из следующих параметров:

  1. контекст Применение
  2. Контекст получил в AppWidgetProvider
  3. контекст IntentService

Иногда у меня возникают проблемы, инструкция обновления Widget (через RemoteViews) игнорируется.

В любое время все содержимое удаляется и не будет рисоваться снова, если я не удалю виджет и не добавлю его снова.

Я пытаюсь понять, почему возникают подобные проблемы.

виджет запускается через:

@Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { 
     Log.d(TAG_PROCESS, " onUpdate "); 

     Intent intent = new Intent(context, UpdateService.class); 
     intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); // embed extras so they don't get ignored 
     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 

     context.startService(intent); 

    } 

Я обновляю виджет в IntentService с помощью этих методов:

/** Updates all widgets with the given remoteViews instructions */ 
    protected static void updateAllWidgets(Context context, RemoteViews remoteView){ 
     ComponentName thisWidget = new ComponentName(context, WidgetActivity.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(context); 
     manager.updateAppWidget(thisWidget, remoteView); 
    } 

    /** Update a given widget (id) with the given remoteViews instructions */ 
    protected static void updateWidget(Context context, RemoteViews remoteView, int widgetId){ 
     AppWidgetManager manager = AppWidgetManager.getInstance(context); 
     manager.updateAppWidget(widgetId, remoteView); 
    } 
+0

Может показать код? –

+0

@ci_ Я добавил код – htafoya

ответ

0

Ну, кажется, что контекст не проблема.

Я использовал контекст службы.

Проблема была в том, что с помощью manager.updateAppWidget (thisWidget, remoteView); иногда перерисовывает весь виджет, потому что, как говорит doc, он указывает описание всего Widget.

Решение было использовать частичное обновление, потому что мое приложение виджет управляет несколькими частичных обновлений только некоторые отображенных просмотров:

/** Updates all widgets with the given remoteViews instructions */ 
    protected static void updateAllWidgets(Context context, RemoteViews remoteView){  
     ComponentName thisWidget = new ComponentName(context, WidgetActivity.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(context); 
     int[] allWidgetIds = manager.getAppWidgetIds(thisWidget); 
     manager.partiallyUpdateAppWidget(allWidgetIds, remoteView); 
    } 

    /** Update a given widget (id) with the given remoteViews instructions */ 
    protected static void updateWidget(Context context, RemoteViews remoteView, int widgetId){ 
     AppWidgetManager manager = AppWidgetManager.getInstance(context); 
     manager.partiallyUpdateAppWidget(widgetId, remoteView); 
    }