Разъединенные намерения AppWidget после перезапуска домашнего процесса
-
19-09-2019 - |
Вопрос
Мое Android-приложение Transdroid предлагает несколько виджетов главного экрана.Каждый AppWidget имеет 2 "кнопки" (ImageButton), одна из которых запускает приложение, а другая запускает какое-либо действие, которое обновляет содержимое AppWidget.Довольно просто. Здесь это скриншот.Код виджета находится на моем веб-сайте Google Code, но самое главное:
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_15);
views.setOnClickPendingIntent(R.id.widget_action, PendingIntent.getActivity(context, 0, new Intent(context, Transdroid.class), 0));
appWidgetManager.updateAppWidget(id, views);
Проблема в том, что:onUpdate виджета не вызывается после перезапуска начального процесса, и, следовательно, PendingIntents, используемые для прикрепления функциональности к кнопкам, теряются.
Это довольно легко воспроизвести.
- Запустите эмулятор
- Добавьте виджет (который использует PendingIntent, скажем, для запуска действия)
- Нажмите на кнопку, чтобы увидеть, что это действительно работает
- Принудительно завершите домашний процесс ('adb -e shell kill 96', где 96 - это PID android.process.acore).
- Кнопка виджета больше не работает.
Более точный:при перезапуске домашнего процесса android.process.acore не вызывается onReceive и, следовательно, onUpdate.В свою очередь, никакого Намерения не прилагается.
Кто-нибудь сталкивался с такой же проблемой и знает, как обойти эту проблему?
Решение
Я только что протестировал пару своих собственных appwidgets, и их события щелчка работают нормально после уничтожения acore.Вот мой соответствующий код:
final RemoteViews views = new RemoteViews(context.getPackageName(), layoutId);
views.setOnClickPendingIntent(R.id.widget_view, PendingIntent.getActivity(
context,
0,
new Intent(context, MyActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
PendingIntent.FLAG_UPDATE_CURRENT));
Основное различие, которое я вижу, - это флаги, связанные с намерением;Я бы сказал, что их определенно стоит попробовать.[Тот layoutId
параметр в моем коде задан в другом месте;этот же код используется для нескольких виджетов с разными макетами].