Разъединенные Inventu AppWidget после перезапуска процесса Home

1

My 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 не вызывается после перезапуска Home процесса, и, следовательно, PendingIntents, используемые для прикрепления функциональности к кнопкам, теряются.

Это довольно легко воспроизвести.

  • Запустите эмулятор
  • Добавить виджет (который использует PendingIntent, чтобы, например, начать действие)
  • Нажмите кнопку, чтобы увидеть, как она работает.
  • Сила убить домашние процессы ('adb -e shell kill 96', где 96 - это PID android.process.acore)
  • Кнопка виджета больше не работает.

Точнее: noReceive и, следовательно, onUpdate не вызывается, когда перезагружается процесс android.process.acore Home. В свою очередь, никакого намерения не прилагается.

Кто-нибудь испытал ту же проблему и знает, как обойти эту проблему?

  • 0
    В какой реальной ситуации вы ожидаете, что процесс Home будет перезапущен, не вызывая перезагрузку устройства?
  • 0
    Кажется, это происходит, когда устройство не хватает памяти. Это убьет домашний процесс, чтобы освободить место, но когда позже он вернется на домашний экран (и, таким образом, автоматически запустит домашний процесс снова), мой виджет не обновится.
Теги:
android-appwidget
homescreen

1 ответ

0
Лучший ответ

Я только что проверил пару своих собственных приложений, и их события кликов работают нормально после убийства 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 в моем коде установлен elsewere; этот же код используется для нескольких виджетов с разными макетами].

Ещё вопросы

Сообщество Overcoder
Наверх
Меню