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 ответа:
Похоже, что всякий раз, когда вы отправляете 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
. Возможно, именно поэтому добавление "уникальных данных" помогает.