Есть ли причина не вызывать setIntent при переопределении onNewIntent? - PullRequest
26 голосов
/ 13 октября 2011

Испытывая проблему, подобную этому вопросу , я начал задаваться вопросом, почему мы явно должны вызывать 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);
}

Ответы [ 3 ]

39 голосов
/ 13 октября 2011

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

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

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

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

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

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

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

3 голосов
/ 13 октября 2011

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

1 голос
/ 21 января 2014

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

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

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

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

...