OnClick PendingIntent в виджете иногда не работает


У меня есть виджет и 4 кнопки на нем. Кнопки на самом деле являются ярлыками для других приложений. Я установил ожидающее намерение onClick для каждой кнопки с помощью этого кода:

Intent i = context.getPackageManager().getLaunchIntentForPackage(s);                    
PendingIntent pi = PendingIntent.getActivity(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
remoteViews.setOnClickPendingIntent(curIconId, pi);

Обычно он работает нормально, но иногда он ничего не делает, и в logcat я вижу исключение SendIntentException с сообщением "Не могу отправить ожидающее намерение".

Если я обновляю виджет (т. е. снова устанавливаю отложенное намерение), он снова работает нормально.

Любые идеи о том, почему он ломается иногда?

Спасибо

4 3

4 ответа:

Похоже, что всякий раз, когда вы отправляете RemoteViews виджету, вам нужно полностью указать виджет. Если вы укажете виджет только частично, то если что-то заставит его обновиться (например, поворот экрана), он будет воссоздан только с самыми последними удаленными представлениями.

Вот ссылка, которая указала мне на это http://www.androiddiscuss.com/1-android-discuss/95040.html

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

В моем случае решение состояло в том, чтобы обновить изображения с URL-адресами ресурсов вместо реальных изображений.

Боюсь, что я не могу ответить вам - я получаю такое же поведение на телефоне одного сотрудника (Motorola), но не на других телефонах.

Я могу указать, однако, что ваш PendingIntent.getActivity() flags параметр неверен: это Intent.FLAG_ACTIVITY_NEW_TASK должно продолжаться Intent i. Вызов getActivity() требует одного из FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT, или один из флагов Intent.FILL_IN_.

Я также могу упомянуть, что мои клики иногда не удавались, пока я не использовал PendingIntent.FLAG_CANCEL_CURRENT. Возможно, именно поэтому добавление "уникальных данных" помогает.

У меня была та же проблема.: Виджет не работал после поворота. Проблема в моем виджете заключалась в том, что я переопределил метод onReceive и там коснулся представления для увеличения текстового значения. Я решил проблему, дублируя setOnClickPendingIntent был в onUpdate, в onReceive тоже.