Щелчок AppWidget потерян после перезапуска системы моего процесса

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

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

мой метод 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», но виджет приложения не реагирует на клики. только первый виджет приложения, размещенный на главном экране, реагирует на клики, но только некоторое время. Любые идеи?


person shelll    schedule 13.04.2011    source источник


Ответы (1)


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

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

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

person Jon O    schedule 13.04.2011
comment
щелчок перестает работать = активность MyClass не отображается после нажатия виджета. я обновляю свой виджет только из сервиса. поэтому onUpdate вызывается только тогда, когда я помещаю виджет на главный экран. onEnabled вызывается, когда это необходимо, при размещении первого виджета приложения. как я могу убедиться, что контекст не является действием? когда я перерисовываю виджет с помощью RemoteViews, должен ли я также прикреплять событие щелчка? - person shelll; 14.04.2011
comment
Ваш последний абзац является ответом. моя проблема заключалась в том, что я перерисовывал свой виджет из службы, и я не знал, что я должен также повторно прикрепить события щелчка. теперь, после того, как я перерисовал виджет, я повторно прикрепляю события щелчка, и все работает нормально. мой виджет переживает перезапуск своего процесса, а также поворот экрана. Спасибо! - person shelll; 15.04.2011