Подтвердить что ты не робот

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

При возникновении проблемы, подобной этому вопросу, я начал задаваться вопросом, почему мы явно вызываем setIntent при переопределении onNewIntent и почему этот код не является 't выполняется уже 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);
}
4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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