#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, и теперь нажатие на виджет приложения НИЧЕГО НЕ ДЕЛАЕТ.
Виджет приложения все еще можно обновить вручную, например, из действия. Но нажатие на него не приводит к:
- Отправляется широковещательная рассылка ACTION_ENABLE_DISABLE. или
- Виджет моего приложения получает эту трансляцию.
Происходит одно из приведенных выше событий — например, когда я смотрю в logcat, и сообщения, которые я регистрирую с помощью Log.d в методах ‘onReceive’ виджета, НЕ отображаются.
Почему это? Нужно ли указывать что-либо особенное при отправке широковещательной рассылки или что-либо в объявлении получателя в манифесте?
И, говоря об этом, есть ли что-нибудь лучшее, что можно использовать для выполнения вашего собственного кода при щелчке на представлении в виджете приложения (а не на моем методе).
Большое вам спасибо!
Ответ №1:
В наши дни я столкнулся с той же проблемой. Я тестировал свое приложение на нескольких устройствах, у некоторых устройств была эта проблема, а у некоторых нет. Затем я обнаружил, что если вы убьете процесс виджета (первый, X) в диспетчере задач, то при следующем создании виджета он будет работать нормально. Итак, вот мое решение. Добавьте следующий код в свою функцию OnDisable ().
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
Это приведет к самоуничтожению при удалении виджета. Поэтому в следующий раз, когда вы его создадите, он будет работать нормально.
Комментарии:
1.Я давно исправил свою проблему (удалил службу и создал другую
BroadcastReceiver
для приема трансляций, она ее решила. Я знаю, что если вы удалите / отключите виджет и повторно добавите его, это сработает. Но это была не моя проблема: (Виджет вообще не отключается.