Android, какие флаги Intent рекомендуются для действий, запускаемых уведомлениями - PullRequest
9 голосов
/ 09 ноября 2010

Я сталкиваюсь со специфической проблемой в приложении с несколькими активностями.У меня есть класс диспетчера экрана, который связан со службой.Сервис опрашивает сервер на предмет данных.Диспетчер экрана запускает действие A, B или C на основе данных.Это также позволит пользователю выбрать отображение других действий или может автоматически заменить действие на основе новых данных из службы.В настоящее время вся навигация работает отлично, и если пользователь нажимает кнопку «Домой», соответствующая активность возвращается на передний план, когда пользователь нажимает значок приложений на главном экране Android или в списке недавно запущенных приложений.

Затем мне пришлось реализовать новую функцию для отображения значка и уведомления.Сначала я реализовал это, отображая уведомление только тогда, когда действия больше не были видны, установив его в каждой операции onPause.Работал как шарм и дал пользователю третий вариант для повторного отображения приложения после нажатия кнопки «Домой».Однако, если данные с сервера (когда приложение не отображается) приводят к тому, что менеджер экрана обновляет отображаемое действие, у меня возникают проблемы.Я думаю, что мой стек активности облажался.С тех пор я попробовал немного другую модель, где менеджер экрана обрабатывает уведомления и всегда отображает уведомление, обновляя его новым намерением при каждом обновлении действия, но оно все еще не обрезает его.

Когда приложениесвернутые и измененные данные. Я вижу, как менеджер экрана вызывает startActivityForResult для новой активности, и кажется, что Android знает, что мы свернуты, и не отображает активность.Затем я также могу завершить вызов диспетчера экрана в старом верхнем действии.

В каждом действии в настоящее время установлен флаг singleTop в манифесте и FLAG_ACTIVITY_SINGLE_TOP в коде.Когда данные на сервере не изменились, я запускаю приложение, используя любое из вышеперечисленного, получаю то, что ожидаю, и вызывается onNewIntent для Activity.Однако, когда данные изменились, и пользователь вызывает приложение через уведомление, оно вызывает Activity onCreate.Упражнение действительно запускается и запускается, но затем нажатие возвращает меня к тому, что кажется другим экземпляром того же Упражнения, а не к выходу.Я просто более внимательно посмотрел на свой logcat и увидел 2 вызова функции onResume в Activity, но потом никаких двойных.Намерение?Спасибо за любые идеи!

1 Ответ

7 голосов
/ 09 ноября 2010

Что меня убивает, так это то, что данные с сервера меняются, когда они не отображаются.

Я понятия не имею, что это значит.

Я чувствую, чтоможет быть, я просто упускаю что-то простое, например, другой флаг намерения в намерении уведомления?

Я использовал Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP для решения проблемы «возвращает меня к тому, что похоже на еще один экземпляр той же активности», но в моем случае у меня было приложение для одной активности.

Документация для FLAG_ACTIVITY_CLEAR_TOP также гласит:

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

Также есть FLAG_ACTIVITY_REORDER_TO_FRONT:

"Например, рассмотрим задачу, состоящую из четырех действий: A, B, C, D. Если D вызывает startActivity () с намерением, которое разрешается к компоненту действия B, то B будет приведен кпередняя часть стека истории, с таким результирующим порядком: A, C, D, B. Этот флаг будет игнорироваться, если также указано FLAG_ACTIVITY_CLEAR_TOP. "

Возможноодин из этих шаблонов соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...