Intereting Posts
Есть ли эквивалент setShadowLayer при определении фигур в XML на Android? Proguard и ошибка Как добавить WebView в виджет? Ошибка: выполнение выполнено для задачи ': app: packageDebug'. >! Zip.isFile () Android: как скрыть элемент ListView Камера Android Virtual Device не работает, несмотря на то, что я выбрал веб-камеру в качестве источника В чем разница между открытием приложения на экране приложений и недавно используемым списком приложений? (андроид SwipeActionAdapter с StickyListHeaders Android: последствия наличия targetSDK> BuildTarget Bluetooth не отправляет файл на другое устройство Как вернуться к стилю по умолчанию в EditText, если применить фон? Утечка памяти Admob – избегая пустых действий Файл Android.bat отсутствует в папке sdk \ tools, также у меня нет менеджера AVD и SDK в инструментах, поэтому я могу их заменить Android dev время против времени iPhone dev Java.lang.RuntimeException: Ошибка предоставления результата ResultInfo {who = null, request = 1888, result = 0, data = null} для активности

Есть ли причина не звонить setIntent при переопределении onNewIntent?

При возникновении проблемы, подобной этому вопросу , я начал задаваться вопросом, почему мы явно вызываем setIntent при переопределении onNewIntent и почему этот код не выполняется уже super.onNewIntent .

 @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); // Why isn't this performed by the framework in the line above? setIntent(intent); } 

Solutions Collecting From Web of "Есть ли причина не звонить setIntent при переопределении onNewIntent?"

Объекты Intent постоянно привязаны к Activity , Service и другим компонентам до тех пор, пока эти компоненты запущены. Они не просто уходят, потому что вы перешли в другое приложение. Причина этого заключается в том, что Android может убить процесс в любое время, но пользователь все равно может вернуться и продолжить то, что они делают. Это делает Intents идеальным для хранения или передачи небольших (а иногда и больших) бит информации через Extras.

Метод onNewIntent() специально предназначен для обработки компонентов приложения, которые являются более стойкими и, следовательно, могут быть вызваны более одного раза в течение его жизненного цикла, но им необходимо отслеживать причины, по которым он был вызван (и, следовательно, данные, с которыми он был вызван). setIntent() ли вы setIntent() или нет, зависит от того, что вам нужно сделать.

Если вас не волнует, почему это было впоследствии setIntent() , вы можете сохранить оригинальное Intent , не вызвав setIntent() . Это особенно полезно, когда ваша Activity (или какой-либо другой компонент) делает то же самое независимо от того, кто ее назвал и какие данные он предоставляет.

Если вам необходимо индивидуально реагировать на каждое событие, вы должны, по крайней мере, хранить информацию нового Intent . Это означает, что вы можете избежать setIntent() , однако ни один из компонентов, на которые он ссылается, не будет иметь какую-либо информацию о Intent если вы не отправите их им напрямую. Это может быть желательным поведением для приложения, которое не может гарантировать, что первоначальный Intent был полностью обработан.

Если вам нужно реагировать на каждое намерение индивидуально, а исходное Intent не имеет значения, вы используете setIntent() . Это отбрасывает исходное Intent , которое все еще там … и помещает новое Intent так что, если пользователь уйдет (еще раз), они вернутся в одно и то же место.

Причина, по которой super.onNewIntent() не справляется с этим, заключается в том, что классы основных компонентов не могут определить, является ли новый Intent более важным, чем старый. Все, что он заботится, состоит в том, что у него есть Intent , а не то, что оно есть. Вот почему мы переопределяем такие методы, чтобы определить, что важно, а что нет. Общее ощущение состоит в том, что базовые классы, такие как Activity могут использовать любые данные, которые у нас есть, любыми способами, которые он хочет (если мы не переопределим и не скажем об этом иначе). Однако они не должны (и часто не могут) избавиться от наших данных, если мы не скажем им конкретно. Это аргумент, который вы действительно не хотите иметь с некоторыми программистами. хехе

Надеюсь это поможет.

Документы для состояния onNewIntent: «Обратите внимание, что getIntent () все еще возвращает исходное намерение. Вы можете использовать setIntent (Intent), чтобы обновить его до этого нового намерения». Я предполагаю, что onNewIntent существует, так что ваша активность может быть уведомлена, и супер, вероятно, ничего не делает.

Я только что удалил setIntent(intent) из моей реализации onNewIntent(Intent intent) .

Причина: My MainActivity – одна вершина. В то время как мое приложение запускает его, он запускает другие действия, такие как активность камеры. Когда приложение вернется в MainActivity, в onResume() намерение (last), возвращенное getIntent() , будет переработано, даже если оно уже было обработано ранее.

Моя новая реализация (работает до сих пор): onNewIntent(Intent intent) намерение с помощью onNewIntent(Intent intent) в поле частного экземпляра. В onResume проверьте это поле на отсутствие нуля и немедленно сбрасываем его до нуля, обрабатывая намерение один раз и только один раз.

См. Также https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY