Нажатие AppWidget потеряно после перезапуска системы - PullRequest
3 голосов
/ 14 апреля 2011

Я делаю appwidget, и у меня возникают проблемы с событием click, которое теряется, когда система убивает процесс виджета, а затем перезапускает его.это также происходит после поворота экрана.

сборка против SDK версии 7 и запуск на эмуляторе (2.1) и реальном устройстве с 2.3.3.

метод my onUpdate:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    for (int wid : appWidgetIds) {
        Log.i(TAG, "onUpdate widget #" + wid);

        Intent intent = new Intent(context, MyClass.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, wid);

        PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget);
        widget.setOnClickPendingIntent(R.id.widget_layout, clickIntent);

        appWidgetManager.updateAppWidget(wid, widget);
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

где R.id.widget_layout - идентификатор линейного макета приложения.Я пытался добавить это событие нажатия также в текстовое представление, но с тем же результатом.

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

Вторая проблема: когда я добавляю еще одно приложение на домашнем экране, оно не реагирует на события нажатия. В logcat я вижу сообщение от метода onUpdate "виджет onUpdate #xy ", но приложение не реагирует на нажатия. Только первое приложение, размещенное на главном экране, реагирует на нажатия, но только в течение некоторого времени. Есть идеи?

1 Ответ

2 голосов
/ 14 апреля 2011

Когда вы говорите, что первый виджет перестает отвечать на клики, вы имеете в виду, что метод onUpdate не вызывается? Возможно, поместите некоторый код в onEnabled(Context context), чтобы увидеть, вызывается ли он вместо этого, и если это так, поместите в эту функцию всю необходимую логику. Кроме того, вы можете поймать намерения с помощью метода onReceive (находится по той же ссылке), чтобы увидеть, какие из них фактически получает ваш виджет.

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

Вы также должны убедиться, что каждый раз, когда вы обновляете виджет с помощью объекта RemoteViews, вы отправляете все данные, необходимые для полной реконструкции виджета. Это связано с тем, что, например, при повороте экрана системе не нужно ничего восстанавливать виджет, кроме самого последнего RemoteViews, который вы ему передали.

...