Виджет не обновляется при перезагрузке лаунчера - PullRequest
4 голосов
/ 11 июля 2011

У меня есть виджет, который будет обновляться всякий раз, когда происходит изменение конфигурации (например, ориентация экрана), и всякий раз, когда телефон разблокирован.Этот процесс включает установку обработчиков onClick для кнопок на моем виджете.Это хорошо работает, однако я обнаружил, что есть случай использования, который заставляет мое приложение не отвечать на события onClick.Это частный случай, когда программа запуска сама запускается.

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

Ответы [ 2 ]

10 голосов
/ 12 июля 2011

Оказывается, я спамил new RemoteViews(), когда мне нужно было просто вызвать его один раз, чтобы создать представление, а затем сослаться на этот экземпляр, когда это необходимо. В моем решении у меня есть переменная класса, в которой хранится этот единственный экземпляр RemoteView, и метод доступа к нему.

0 голосов
/ 22 марта 2014

Предложение @Glitch может не работать в определенных случаях, особенно в виджете приложения с ListView. Это потому, что ListView станет очень медленным (попробуйте прокрутить ListView) после того, как appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id) был вызван несколько раз.

Полагаю, единственный экземпляр RemoteView будет хранить все свои выполненные инструкции в списке. Со временем список инструкций будет расти. Каждый раз, когда appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id), большой список команд будет выполняться заново.

Мое предлагаемое решение заключается в следующем. Тем не менее, я считаю, что он будет работать только на определенном устройстве, так как не все устройства будут получать одинаковое широковещательное сообщение при перезапуске модуля запуска.

@SuppressLint("NewApi")
@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();

    if (action.equals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) {
        // http://stackoverflow.com/questions/17396045/how-to-catch-widget-size-changes-on-devices-where-onappwidgetoptionschanged-not
        handleTouchWiz(context, intent);

        // Possible launcher restart.
        handleLauncherRestart(context, intent);
    } else if (action.equals("android.appwidget.action.APPWIDGET_UPDATE_OPTIONS")) {

        // Possible launcher restart.            
        handleLauncherRestart(context, intent);
    } 

    super.onReceive(context, intent);
}

private void handleLauncherRestart(Context context, Intent intent) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
    updateAppWidget(context, appWidgetManager, appWidgetId);
}

private void handleTouchWiz(Context context, Intent intent) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

    int appWidgetId = intent.getIntExtra("widgetId", 0);
    int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
    int widgetSpanY = intent.getIntExtra("widgetspany", 0);

    if (appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) {
        Bundle newOptions = new Bundle();
        // We have to convert these numbers for future use
        // http://stackoverflow.com/questions/10008521/appwidget-size-calculation
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74 - 2);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74 - 2);

        } else {
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 70 - 30);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 70 - 30);
        }

        onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
    }
}
...