Виджет управления питанием отображается на короткое время при обновлении моего собственного виджета через AppWidgetManager, в чем проблема? - PullRequest
8 голосов
/ 07 января 2011

У меня проблема при обновлении моего виджета вручную через AppWidgetManager.updateAppWidget. Платформа Android 2.2.

Вот код:
Я объявил виджет дополнительно к существующему действию в манифесте:

<receiver android:name=".Widget" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" />
</receiver>

Класс виджетов был объявлен в Widget.java:

.
public class Widget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    int use_static_ip;
    RemoteViews remoteViews;

    try {
        use_static_ip = Settings.System.getInt(context.getContentResolver(), Settings.System.WIFI_USE_STATIC_IP);
        if (use_static_ip == 0) { //DHCP
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_dhcp);
        } else { //static IP
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_static);
        }
        Intent call_activity = new Intent(context, StaticIPToggle.class);
        PendingIntent pending_call_activity = PendingIntent.getActivity(context, 0, call_activity, 0);
        remoteViews.setOnClickPendingIntent(R.id.widget_icon, pending_call_activity);
        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
    } catch (SettingNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

В существующем упражнении я добавил несколько строк для обновления виджета вручную:

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
        ComponentName componentName = new ComponentName(getApplicationContext(), Widget.class);
        int[] ids = appWidgetManager.getAppWidgetIds(componentName);
        Intent update_widget = new Intent();
        update_widget.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
        update_widget.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        getApplicationContext().sendBroadcast(update_widget);

Но теперь у меня есть эта ошибка: Если виджет включен, он отображает виджет настроек энергопотребления в течение короткого периода времени (~ 0,5 сек-1 сек) до отображения нужного виджета.

Вот снимок экрана этой проблемы (последовательность слева направо): http://i.stack.imgur.com/rHkjw.jpg

Сначала виджет, как на левом изображении, затем меняется на среднее изображение и либо остается там, либо меняется на правое изображение через ~ 0,5-1 сек.

К сожалению, я не вижу никакой ошибки в коде, не так ли?

Надеюсь, вы поможете мне решить эту проблему;) Заранее спасибо, С уважением, Оли

Ответы [ 2 ]

0 голосов
/ 30 августа 2013

Я использовал тот же программный способ для ручного обновления виджета, что и вы (с Можно ли программно создать намерение для APPWIDGET_UPDATE? ) и обнаружил, что это является точной причиной проблемы.

Это все еще происходит в 4.2 и 2.3, Официальные и неофициальные ПЗУ (Touchwiz сходит с ума, когда это происходит).

Единственный способ, которым я мог это исправить, - удалить все обновление, включающее трансляцию иобновить виджет удаленно, отправив обычный Broadcast поставщику виджетов и позвонив по номеру

ComponentName thisWidget = new ComponentName(context,AvailabilityWidgetProvider.class);
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,views);

из onReceive

(это работает для меня, так как мои виджеты идентичны)

Таким образом, проблема, похоже, не возникла, и я мог удаленно обновлять виджет.Старый вопрос, я знаю, но заслуживает ответа, так как это было все, что я мог найти в этом странном вопросе.

0 голосов
/ 22 октября 2012

У меня была точно такая же проблема.Я решил это путем ручного обновления виджета НЕ через трансляцию, а путем прямого вызова AppWidgetManager.updateAppWidget (ComponentName, RemoteViews) вместо AsyncTask.

Попробуйте это внутри своего класса Widget:

/**
 * Asynchronously builds views and updates the widget.
 */
private static class UpdateWidgetTask extends AsyncTask<Void, Void, RemoteViews> {
    private AppWidgetManager mAppWidgetManager;
    private Context mContext;

    private UpdateWidgetTask(AppWidgetManager appWidgetManager, Context context) {
        mAppWidgetManager = appWidgetManager;
        mContext = context;
    }

    @Override
    protected RemoteViews doInBackground(Void... params) {
        DebugLog.d(TAG, "Asynchronously updating widget.");
        RemoteViews views = buildUpdate(mContext);
        return views;
    }

    @Override
    protected void onPostExecute(RemoteViews views) {
        ComponentName thisWidget = new ComponentName(mContext, Widget.class);
        mAppWidgetManager.updateAppWidget(thisWidget, views);
    }
}

/**
 * Asynchronously updates all widgets of this type. This is the fastest way to update the widget.
 *
 * @param context The context.
 */
public static void updateWidget(Context context) {
    new UpdateWidgetTask(AppWidgetManager.getInstance(context), context).execute();
}

Затем обновите, вызвав Widget.updateWidget (this) из вашей деятельности.

...