Android OnNewIntent не вызывается
Я видел несколько подходов и все перепробовал, но не смог заставить его работать. Не знаю, почему это так сложно, в документации это выглядит так просто! Я хочу вызвать OnNewIntent с уведомлением (пользователь нажимает на него в панели уведомлений).
В настоящее время я установил свою активность как singleTop
Это код, в котором я создаю уведомление:
Это метод OnNewIntent в моей MainMenuActivity:
Я никогда не получаю вызова OnNewIntent. Я не знаю, что делаю не так. Я использую только 2 действия во всем приложении, а MainMenuActivity идет после LoginActivity, поэтому MainMenuActivity всегда должен быть наверху стека (у меня есть больше фрагментов, в которых я заменяю их внутри MainMenuActivity).
Любая помощь будет оценена по достоинству! Спасибо вам, ребята.
3 ответа
Хорошо, он заработал вскоре после публикации моего вопроса. Я думаю, что ключевое отличие нашего кода состоит в том, что я передаю флаг PendingIntent.FLAG_UPDATE_CURRENT при создании / извлечении объекта PendingIntent. Это сообщение Помог мне в этом разобраться.
После долгой проверки я заметил, что Android 4.4 (Kitkat и, возможно, ниже) не будет вызывать onNewIntent и onResume, если вы используете FLAG_UPDATE_CURRENT для pendingIntent. Как только вы измените его на FLAG_ONE_SHOT, он начнет работать. на Android 6 (и, вероятно, также 5), однако onNewIntent работает даже с флагом FLAG_UPDATE_CURRENT.
Однако кажется, что если вы создаете несколько ожидающих намерений (например, после получения двух уведомлений), данные не будут обновляться с помощью флага FLAG_ONE_SHOT, поэтому флаг FLAG_CANCEL_CURRENT может быть лучшим выбором (у него нет проблем с не обновленными данными)
Сначала вы должны добавить android:launchMode=»singleTop» к определению действия в файле манифеста, как показано ниже.
Затем, как сказал Хасан Масуд, вы должны добавить к своему действию Intent.ACTION_MAIN и Intent.CATEGORY_LAUNCHER , как показано ниже.
Это все. Таким образом, если приложение открыто и когда вы щелкаете уведомление, метод onNewIntent (..) срабатывает, но что бы ни случилось, если приложение закрыто, когда вы щелкаете уведомление, намерение уведомления перейдет в onCreate (.. ) метод текущей Activity.
Источник
onNewIntent не вызывается
Я начал новую активность, вызвав ее. Но после начала действия в методе onNewIntent finish() не вызывается .
3 ответа
Именно из-за onNewIntent не вызывается .
Я положил это на то, где эта деятельность называется.
Тогда это работает как шарм!
Это из-за вызова новой активности. И FLAG_ACTIVITY_SINGLE_TOP позволяет onNewIntent быть вызванным. Этот FLAG_ACTIVITY_SINGLE_TOP не запустит новую активность .
Я использовал onNewIntent для реализации поиска в Android. Я столкнулся с проблемой, что onNewIntent не вызывался, когда я использовал кнопку Go на клавиатуре в эмуляторе. Я решил проблему, поместив свой код для обработки намерения также в метод onCreate . Это необходимо сделать, чтобы убедиться, что намеренное действие обрабатывается при запуске нового экземпляра действия.
Это создает проблему, поскольку onCreate вызывается всякий раз, когда действие восстанавливается также из предыдущего состояния. Таким образом, метод обработки намерений вызывается даже при изменении ориентации.
Решение. Используйте if (savedInstanceState==null) , чтобы определить, восстанавливается ли действие из предыдущего состояния или это новый поиск.
Сначала Отладка и Удалить под нежелательной строкой.
Позвоните в finish () в Намерении
Если установлено, новое действие не сохраняется в стеке истории. Как только пользователь уходит от него, действие заканчивается. Это также может быть установлено с атрибутом noHistory.
Источник
Русские Блоги
Четыре режима запуска Android и метод onNewIntent
Предисловие
Я думаю написать это, потому что я столкнулся в методе onStart () перед использованием метода getIntent () в методе onStart () для передачи данных, переданных при запуске операции. Я был озадачен в течение долгого времени, а затем решил хорошенько взглянуть на это место. Сначала в статье будет рассказано о четырех режимах запуска в сочетании с простой демонстрацией.После выяснения режима запуска вы поймете, почему getIntent () не может получить нужные нам данные.
Среда разработки: Android Studio 3.0.1
оборудование: Счастливый Android 5.1.1
Решение
Потому что я чувствую, что статья очень многословна, но боюсь, что она недостаточно ясна. Если вы хотите найти решение напрямую, вы можете просто посмотреть здесь. Переопределите метод onNewIntent целевой операции. Затем вы можете получить правильное значение через getIntent в onStart.
Android четыре режима загрузки
Настройки режима запуска активности:
Простой взгляд на концепцию может иметь некоторую абстракцию, поэтому я буду понимать ее в сочетании с примером кода. Конечно, я думаю, что после определенного периода разработки мы сможем понять пункты знаний через официальные документы. Нам нужна эта способность Повысить эффективность обучения. Это все отступление, а затем следуйте анализу кода.
Во-первых, чтобы уменьшить количество повторяющихся кодов, напишите базовый класс Activity и необходимые нам журналы. Здесь есть одна вещь, на которую следует обратить внимание: не используйте системную кнопку возврата для возврата к основному интерфейсу, потому что это уничтожит текущую активность, поэтому добавьте кнопку к текущей активности, чтобы вернуться к основному интерфейсу. Чтобы увидеть разницу между различными режимами запуска Активности, пусть запущенный Мероприятие переходит в фоновый режим, а не разрушается.
Как показано на рисунке, нажмите кнопку НАЗАД, чтобы вернуться к главному интерфейсу вместо маленького треугольника.
Затем напишите несколько производных классов BaseActivity, просто наследуйте напрямую, ничего не делайте, как показано ниже.
Затем нам нужно зарегистрировать нашу активность в файле AndroidManifest.xml и установить различные методы запуска. Так же, как следующее.
После того, как вышеупомянутые шаги выполнены, мы напишем наш основной интерфейс, который главным образом должен добавить несколько кнопок, чтобы начать вышеупомянутые действия в различных режимах запуска.
Интерфейс так же прост, как на рисунке ниже, хахаха, название кнопки уже отображало соответствующий режим запуска действия.
Код для действия, соответствующего этому интерфейсу, выглядит следующим образом: обе кнопки запускают начало действия, но информация, переносимая Намерением, отличается.
Вся работа кода завершена, запустите и проверьте журнал.
- SingleTop
Нажмите кнопку SingleTop на главном интерфейсе (она связана с событием startActivity), войдите в Activity с режимом запуска как SingleTop, затем нажмите кнопку BACK, чтобы вернуться к основному интерфейсу, а затем нажмите кнопку SIngleTop2 ( Это связано с событием startActivity2), чтобы войти в Activity.
Три красных поля представляют журнал событий трех щелчков. Видно, что хотя в стеке уже есть экземпляр SingleTop, он находится в фоновом режиме. В этот раз, если вы снова вызовите Start Activity Метод создаст новый пример SingleTop. Метод onCreate () запускается дважды, а затем метод onNewIntent () не запускается. Данные, полученные в onStart (), также являются основными Правильные данные из интерфейса. - SingleTask
Операция та же, что и выше, смотрите результат
Очевидно, что даже если текущая активность переходит в фоновый режим, когда она запускается через startActivity2 из основного интерфейса, новые экземпляры не создаются, но экземпляры в стеке непосредственно выводятся на передний план. И метод onNewIntent () также запускается, но вы должны заметить, что данные, полученные onStart (), не совпадают и не обновляются. Причина почему?
Потому что при запуске экземпляра Activity с помощью startActivity, если экземпляр Activity не существует в стеке, он проходит полный жизненный цикл, и также вызывается метод setIntent (Intent intent) для Activity, но он не будет проходить, если он уже существует. Полный жизненный цикл завершен, но вызывается метод onNewIntent (), и этот метод не выполняет никаких операций в исходном коде Activity и не изменяет значение mIntent в этом экземпляре.
После долгого разговора я немного запутался, поэтому давайте перейдем к исходному коду и посмотрим.
Жизненный цикл при первом запуске:onCreate–>onStart, Вызовет setIntent ()
второй запуск (экземпляр находится в стеке, но не на переднем плане):onNewIntent–>onRestart–>onStart, Выше журнал может увидеть это. Ключевым моментом является то, что в этом onNewIntent ничего не делается, реализация пуста, и это также записано в исходном коде. Напоминаем вам переопределить этот метод и вызвать метод setIntent (). Это то, что я упоминал ранее.
SingleInstance
Для этого вопроса SingleInstance и SingleTask абсолютно одинаковы (конечно, я не говорил, что оба они одинаковы).
Тогда у меня нет подробного объяснения этих четырех режимов запуска, если я плохо знаюНажмите здесьЭто очень хорошо написано.
Вывод
Прошлой ночью я написал резюме на всю ночь, но меня это не удовлетворило. Сегодня я часом разговаривал с моим репетитором. Он много мне рассказал и дал совет, что делать дальше, чтобы я мог сосредоточиться на базовом обучении. , работая трудно изучать технологии, он сказал, что я могу видеть, что я в восторге от технологии, объяснил много очков знаний, которые я должен обратить внимание, и особо подчеркнул, что я должен укрепить свои навыки общения. Большое ему спасибо. Я не знаю, увижу ли я снова в будущем. Он уйдет из компании завтра. Надеюсь, я оправдаю его надежды и усердно работаю. Давай!
Источник
Ошибка: onNewIntent не вызывается для одноразового действия с Intent.
Кажется, есть ошибка в startActivity .
Установив действия для singleTop с разными taskAffinity в AndroidManifest.xml и используя Intent.FLAG_ACTIVITY_NEW_TASK при вызове startActivity , два действия могут быть созданы в двух заданиях (одно действие на задание).
Повторный вызов startActivity вернется к первому занятию /задаче и onNewIntent называется. Однако вызов startActivity в четвертый раз вернется ко второму заданию /заданию, но onNewIntent не вызывается.
Единственная разница между этими двумя задачами заключается в их taskAffinity . Почему-то наблюдается асимметричное поведение.
Однако, если Intent.FLAG_ACTIVITY_SINGLE_TOP также используется, то onNewIntent вызывается как положено.
Может показаться, что singleTop в AndroidManifest.xml отличается от Intent.FLAG_ACTIVITY_SINGLE_TOP в Intent .
1 ответ
это немного поздно, но так как я только что столкнулся с этим — как упоминает Мэтт, флаг активности единой вершины в манифесте и в намерении не совпадают (по крайней мере, в предыдущих версиях Android).
в методе startActivityUncheckedLocked :
посмотрите на строку 2204 —
так что он просто проверяет флаги запуска по назначению, а не проверяет манифест. сравните это с выпуском мармелада желе:
посмотрите на строку 2835 —
так что кажется, что в mr1 они проверяют r.launchMode (предположительно значение AndroidManifest.xml ) в дополнение к launchFlags (предположительно, о самом намерении), тогда как в более старых версиях они проверяли только флаги намерения.
короткая версия — установите флаг единой вершины как в намерении, так и в манифесте.
Источник
OnNewIntent не вызывается
У меня очень странная ситуация.
Имея одно приложение, я решил создать еще один код из первого.
Я скопировал файлы .xml, скопировал файлы .java, чтобы все было в порядке.
Но есть одна ОГРОМНАЯ проблема: мой onNewIntent(Intent intent) вызывается в первом проекте, но он не вызывается во втором проекте (код тот же!)
Метод, который может вызвать тогда, но не может теперь запускаться
Вот метод onNewIntent ():
К сожалению, я не вижу «Я РАБОТАЛ» в своих журналах.
Я прочитал много подобных вопросов как на SO, так и через Интернет, попробовал установить флаги Intent SINGLE_TOP, SINGLE_TASK и так далее.
Вот проект Android Manifest of WORKING:
Я довольно отчаянный, почему аналогичный код больше не работает?
EDIT: Я пробовал все: SINGLE_TOP, SINGLE_INSTANCE, SINGLE_TASK ..
Но потом я иногда делал это на другом мероприятии:
И это наконец сработало!
Я не знаю, является ли это грязным обходным путем или ошибкой, если кто-нибудь может это объяснить, пожалуйста, комментируйте.
Преамбула:
Хорошо, я немного опоздал на это, но, когда я наткнулся на ту же проблему и не ответил ни на один из четырех вопросов, связанных с stackoverflow, я нашел для этого вопроса, решил проблему для меня, вот что я понял вне.
ОТВЕТ:
Есть несколько возможных причин, почему onNewIntent не вызывается, и я собираюсь перечислить их все – и все, что я знаю.
- Как упоминалось во многих ответах до и в документе для функции onNewIntent (ссылка в ответе Ярослава), вам либо нужна манифеста android:launchMode=»singleTop» для активности, где вы хотите, чтобы onNewIntent был вызван, или Intent used Для начала действия должен иметь флаг FLAG_ACTIVITY_SINGLE_TOP . Вам не нужны оба (это не || && a && ;-))! OnNewIntent также нужно вызвать для android:launchMode=»singleTask» , но прежде чем использовать это, лучше проверить документацию android: launchMode, потому что это имеет гораздо больше последствий, чем только один вызов функции.
- В старых версиях Android произошла ошибка , которая в основном предотвращала android:launchMode=»singleTop» от работы как указано и, следовательно, onNewIntent от вызова. Ошибка не была официально решена, но я не смог воспроизвести ее в версии 4.4.2 (Samsung S4 Mini). Таким образом, он, кажется, был исправлен в какой-то момент между 4.0.x и 4.4.2.
Не каждый раз, когда выполняются предварительные условия, о которых говорилось выше, называтьNewIntent. Поскольку документация функции гласит:
… когда активность перезапускается в верхней части стека действий вместо нового экземпляра запускаемой операции, onNewIntent () будет вызываться в существующем экземпляре с Intent, который использовался для повторного запуска его , «
Это означает, что если активность вновь создана, onNewIntent не будет вызываться, независимо от того, какие флаги launchMode или Intent вы установили!
- По моему мнению, вызывается либо onCreate, либо onNewIntent, но никогда и то, и другое.
- Итак, если вы хотите передать данные в действие через Intent, и он должен всегда работать (как в моем случае), независимо от того, будет ли возобновлена деятельность или будет создана новая деятельность, вы можете сделать так, как описано в этом очень полезном сообщении в блоге ,
В качестве варианта решения, описанного в вышеупомянутом сообщении в блоге, вы также можете воспользоваться тем фактом, что независимо от того, было вызвано onNewIntent или onCreate, onResume всегда будет вызываться впоследствии и сделать что-то вроде этого:
В этом примере getIntent всегда будет получать Intent, который вы использовали для вызова startActivity или Notification, поскольку новый Intent также будет установлен для Activity, если актив только что был создан (и, следовательно, onCreate был вызван).
постамбула:
Извините, за длинную статью. Надеюсь, вы нашли в нем что-то полезное.
Активность, которую вы хотите получить onNewIntent (), должна иметь
Или добавьте флаг tn intent
Как указано в onNewIntent (Intent)
Вот одна ситуация, которая может вас укусить, а также немного больше информации: onNewIntent вызывается как ожидалось с помощью этого кода:
Но не с этим кодом
Причина этого заключается в том, что во втором кодовом блоке новая активность добавляется сверху до вызова финиша для текущей активности, поэтому чтобы второй блок кода работал, вы должны добавить флаг FLAG_ACTIVITY_CLEAR_TOP как это было предложено некоторыми другими Ответы, например:
Обратите внимание, что finish вообще не называется, потому что он вызван для вас. Из документации для флага FLAG_ACTIVITY_CLEAR_TOP :
Если установлено, и запущенная деятельность уже запущена в текущей задаче, то вместо запуска нового экземпляра этого действия все остальные действия поверх нее будут закрыты, и этот намерение будет доставлен в (теперь Наверх) старая деятельность как новое намерение.
Лучший способ обработать onNewIntent с singleTop – это просто:
Затем выполните всю свою логику в getIntent внутри onResume .
Я использовал onNewIntent для поиска в Android. Я столкнулся с проблемой, что onNewIntent не вызывался, когда я использовал кнопку Go на клавиатуре в эмуляторе. Я решил проблему, поставив свой код для обработки намерения в методе onCreate . Это необходимо сделать, чтобы убедиться, что действие намерения выполняется, когда запущен новый экземпляр активности.
Это создавало проблему, так как onCreate вызывается всякий раз, когда активность восстанавливается из предыдущего состояния. Таким образом, метод обработки намерений вызывается даже при изменении ориентации.
Решение. Используйте if (savedInstanceState==null) чтобы определить, восстанавливается ли активность из предыдущего состояния, или это новый поиск.
Чтобы войти в метод onNewIntent, вам нужно в вашем файле AndroidManifest.xml, после того, как вы включили основную деятельность в режим запуска, в этом режиме запуска вам нужно поставить singleInstance, например:
Теперь вы сможете ввести вам методNewIntent.
Источник