Android - виджет приложения не может использовать ожидающие намерения при перезапуске приложения - PullRequest
0 голосов
/ 05 октября 2011

Мое приложение, кроме своей деятельности, имеет сервис и виджет приложения.

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

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. OR
  2. Виджет моего приложения, получающий эту трансляцию.

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

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

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

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

1 Ответ

0 голосов
/ 19 января 2012

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

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

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

...