Режим запуска Android с одним верхом и метод onNewIntent

Я прочитал в документации Android, что, установив мою активностьs свойство launchMode для singleTop ИЛИ, добавивFLAG_ACTIVITY_SINGLE_TOP пометьте мне, что зоветstartActivity(intent) будет повторно использовать один экземпляр Activity и даст мне намерение вonNewIntent Перезвоните. Я сделал обе эти вещи, иonNewIntent никогда не стреляет иonCreate срабатывает каждый раз. Документы также говорят, чтоthis.getIntent() возвращает намерение, которое было сначала передано Деятельности, когда это было сначала создано. В яonCreateя звонюgetIntent и я'я получаю новый каждый раз (яm создание объекта намерения в другом действии и добавление дополнительного к нему ... это дополнительное значение должно быть одинаковым каждый раз, если оно возвращало мне один и тот же объект намерения). Все это приводит меня к мысли, что моя деятельность не ведет себя какодна вершина "и я нене понимаю почему.

Чтобы добавить немного фона на случай, если яЯ просто пропустил необходимый шаг, здесьs моя декларация активности в манифесте и код Iиспользую для запуска активности. Сама деятельность нене делайте ничего заслуживающего упоминания в отношении этого:

в AndroidManifest.xml:

    
         

в моем призвании

        Intent i = new Intent();
        i.putExtra(EXTRA_KEY_ARTIST, id);
        i.setClass(this, ArtistActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(i);
 Malachiasz07 февр. 2014 г., 15:04
проверьте это слайд-шоу. Это очень хорошо объясняет launchMode:slideshare.net/RanNachmany/...

Ответы на вопрос(3)

Принятый ответ не совсем корректен. Если onDestroy () вызывался ранее, то да, onCreate () всегда вызывался бы. Тем не мение,это утверждение неверно: "Если вы поднимитесь выше в стеке действий к другим действиям и оттуда снова вызовите свой ArtistActivity.class, он пропустит onCreate () и перейдет непосредственно к onNewIntent () "

"SingleTop» разделhttp://developer.android.com/guide/components/tasks-and-back-stack.html объясняет, как это работает (обратите внимание на текст, выделенный жирным шрифтом ниже;я также доказал это с помощью моей собственной отладки): "

Например, допустим задачуЗадний стек s состоит из корневого действия A с действиями B, C и D сверху (стек A-B-C-D; D на вершине). Намерение прибывает для действия типа D. Если D имеет значение по умолчанию "стандарт»В режиме запуска запускается новый экземпляр класса, и стек становится A-B-C-D-D. Однако, если D 'режим запуска "SingleTop»существующий экземпляр D получает намерение через onNewIntent (), потому чтоs на вершине стекастек остается A-B-C-D. Тем не мение,если для действия типа B приходит намерение, то в стек добавляется новый экземпляр B, даже если его режим запуска "SingleTop ""

Другими словами, запуск действия через SINGLE_TOP будет повторно использовать существующее действие, только если оноуже на вершине стека, Это победилоt работает, если другое действие в той же задаче находится наверху (например, действие, которое выполняет startActivity (SINGLE_TOP)); вместо этого будет создан новый экземпляр.

Вот два способа это исправить чтобы получить желаемое поведение SINGLE_TOP, основной целью которого является повторное использование существующего действия вместо создания нового ...

Первый способ (как описано в разделе комментариев принятого ответа): вы можете добавить launchMode of "singleTask» к вашей деятельности. Это вызовет onNewIntent (), потому что singleTask означает, что в данной задаче может быть только ОДИН экземпляр конкретного действия. Это несколько хакерское решение, потому что, если вашему приложению требуется несколько экземпляров этого действия в конкретной ситуации (как я делаю для своего проекта), вы 'снова ввернут.

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

Основная цель FLAG_ACTIVITY_SINGLE_TOP - предотвратить создание нескольких экземпляров Activity. Например, когда эта деятельность может быть запущена через намерение, которое приходит извне вашего приложения »с главной задачей. Для внутреннего переключения между действиями в моем приложении яЯ обнаружил, что FLAG_ACTIVITY_REORDER_TO_FRONT - это, как правило, то, что я хочу вместо этого.

 Mattia Ruggiero21 сент. 2016 г., 16:29
Действительно хороший ответ, это должен быть принятый.
 GuillermoMP16 февр. 2016 г., 23:17
Спасибо. Действительно, принятое объяснение ответа является правильным дляsingleTask» поведение, но не для "SingleTop» где вверх навигация может создать несколько экземпляров одного действия.
 yat017 февр. 2016 г., 01:57
Одно дело ... Во-вторых, использование FLAG_ACTIVITY_REORDER_TO_FRONT все еще должно сочетаться с launchModeSingleTop» право?

Установите этот флаг для вашего намерения:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)
Решение Вопроса

Вы проверили, еслиonDestroy() был также назван? Тот'наверное, почемуonCreate() вызывается каждый раз вместоonNewIntent(), который будет вызываться только в том случае, если действие уже существует.

Например, если вы оставите свою деятельность с помощью кнопки BACK, она будет уничтожена по умолчанию. Но если вы поднимитесь выше на стеке активности в другие виды деятельности и оттуда позвонитеArtistActivity.class опять пропущуonCreate() и идти прямо кonNewIntent()потому что действие уже было создано, и так как вы определили его какsingleTop Android победилсоздать новый экземпляр этого, но взять тот, который уже валяется.

Что я делаю, чтобы увидеть, чтоЯ реализую фиктивные функции для всех состояний каждого действия, так что я всегда теперь чтопроисходит:

@Override
public void onDestroy() {
    Log.i(TAG, "onDestroy()");
    super.onDestroy();
}

То же самое для,,,,onRestart()onStart()onResume()onPause()onDestroy()

Если вышеупомянутое (кнопка НАЗАД) не былоВ случае вашей проблемы, реализация этих манекенов, по крайней мере, поможет вам лучше их отладить.

 kellogs06 авг. 2011 г., 07:28
Android: launchMode =»singleTask» - в моем случае рассматриваемая деятельность начиналась извне своей основной задачи
 AZ1326 авг. 2011 г., 03:57
@kellogs отличный совет. Я'Я работаю над приложением на основе NFC, и каждый раз, когда я прикасался к телефону с тегом, запускался новый экземпляр моей деятельности. Отскок-иерархия была беспорядком. launchmode =»singleTask» очень помогает, окружение во время выполнения предотвращает многократное создание одной и той же активности, что мне очень помогло! Спасибо.
 Ovidiu Latcu17 сент. 2012 г., 17:01
Спасибо, босс ! : D
 Steve B19 сент. 2015 г., 01:44
singleTask ограничивает вас только одним экземпляром действия в вашей задаче, что может конфликтовать с тем, как ваше приложение будет вести себя в других случаях использования. Использование FLAG_ACTIVITY_REORDER_TO_FRONT, вероятно, будет лучшим выбором, поскольку оно повторно использует существующее действие, перенося его в начало стека.
 jowett18 окт. 2011 г., 11:45
я вижу, что ondestory () неТ быть названным. Только onStop () вызывается каждый раз. На самом деле, это более вероятно, введите непосредственно в onResume (), ни onCreate (), ни onNewintent ();
 Kevin04 сент. 2015 г., 14:43
SingleTask вместо singleTop устранил проблемы, которые были у меня только на устройствах Samsung - эмулятор и другие устройства работали просто отлично. Самсунг не сделал. SingleTask исправил эту проблему.
 kellogs05 авг. 2011 г., 06:23
Привет, у меня та же проблема, что и у OP, но onDestroy никогда не вызывается в моем случае - я просто получаю новые экземпляры активности: -s. Есть еще идеи?
 Rich11 нояб. 2009 г., 17:12
это скорее всего то, чтопродолжается Я создал что-то вродецелевая страница » активность как точка входа. В точке приземления вы выбираете исполнителя и переходите к ArtistActivity. Пользователь использует кнопку «Назад», чтобы вернуться к основному виду деятельности и выбрать снова. У меня сложилось впечатление, что активность будет зависать после первого использования и что ясэкономить на производительности, не восстанавливая его. Должен ли я беспокоиться о производительности здесь, или этот шаблон подходит для простых действий?
 ghostCoder05 авг. 2011 г., 13:39
@kellogs, то же самое происходит со мной .. :-( какой-нибудь еще soln?

Ваш ответ на вопрос