Android App Widget - 要使用的上下文

时间:2015-09-11 20:15:22

标签: android android-context android-appwidget intentservice appwidgetprovider

我有一个应用小部件,可以在接收更新时启动intentService。

我不确定使用哪个上下文来更新Widget,我应该使用以下其中一个:

  1. 申请背景
  2. 在AppWidgetProvider中收到的上下文
  3. IntentService上下文
  4. 有时我遇到麻烦,忽略更新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);
        }
    

1 个答案:

答案 0 :(得分:0)

好吧,上下文似乎不是问题。

我使用了服务上下文。

问题是因为使用了manager.updateAppWidget(thisWidget,remoteView);有时会重新绘制所有小部件,因为正如doc所说,它指定了整个Widget描述。

解决方案是使用部分更新,因为我的app小部件只管理一些显示视图的部分更新:

/** 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);
    }