Виджет Android-приложения не может использовать отложенные намерения при перезапуске приложения

#android #widget #broadcastreceiver

#Android #виджет #broadcastreceiver

Вопрос:

В моем приложении, помимо его действий, есть служба и виджет приложения.

Я хотел, чтобы нажатие на виджеты приводило к выполнению фрагмента кода, фрагмента, который будет включать / отключать службу приложения. Итак, нажатие на виджет приложения запускает отложенное намерение, созданное таким образом:

 Intent intent = new Intent(ACTION_ENABLE_DISABLE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
  

(ACTION_ENABLE_DISABLE определяется мной, конечно.)

И в манифесте я указываю это действие в фильтре намерений.

Затем я переопределил метод onReceive, и если действие намерения имеет значение ACTION_ENABLE_DISABLE, я выполняю тот фрагмент кода, который включает / отключает службу. Если это не так, я вызываю super.onReceive, поэтому обычные трансляции виджетов приложений будут выполнены.

Пока все хорошо! виджет работает нормально.

Но, допустим, я создал его, когда PID моего приложения был X. Затем пользователь оставил мои действия, и они были уничтожены; Так что, как служба, допустим, пользователь закрыл его. Таким образом, в моем процессе нет никаких действий или служб — он уничтожается / выходит из диспетчера задач, оба случая актуальны. При следующем создании у него другой PID, и теперь нажатие на виджет приложения НИЧЕГО НЕ ДЕЛАЕТ.

Виджет приложения все еще можно обновить вручную, например, из действия. Но нажатие на него не приводит к:

  1. Отправляется широковещательная рассылка ACTION_ENABLE_DISABLE. или
  2. Виджет моего приложения получает эту трансляцию.

Происходит одно из приведенных выше событий — например, когда я смотрю в logcat, и сообщения, которые я регистрирую с помощью Log.d в методах ‘onReceive’ виджета, НЕ отображаются.

Почему это? Нужно ли указывать что-либо особенное при отправке широковещательной рассылки или что-либо в объявлении получателя в манифесте?

И, говоря об этом, есть ли что-нибудь лучшее, что можно использовать для выполнения вашего собственного кода при щелчке на представлении в виджете приложения (а не на моем методе).

Большое вам спасибо!

Ответ №1:

В наши дни я столкнулся с той же проблемой. Я тестировал свое приложение на нескольких устройствах, у некоторых устройств была эта проблема, а у некоторых нет. Затем я обнаружил, что если вы убьете процесс виджета (первый, X) в диспетчере задач, то при следующем создании виджета он будет работать нормально. Итак, вот мое решение. Добавьте следующий код в свою функцию OnDisable ().

 int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
  

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

Комментарии:

1.Я давно исправил свою проблему (удалил службу и создал другую BroadcastReceiver для приема трансляций, она ее решила. Я знаю, что если вы удалите / отключите виджет и повторно добавите его, это сработает. Но это была не моя проблема: (Виджет вообще не отключается.