Принятый ответ не совсем корректен. Если onDestroy () вызывался ранее, то да, onCreate () всегда вызывался бы. Однако это утверждение неверно :
«Если вы поднимитесь выше в стеке действий к другим действиям и оттуда снова вызовите свой ArtistActivity.class, он пропустит onCreate () и перейдет непосредственно к onNewIntent ()» *
Раздел "singleTop" http://developer.android.com/guide/components/tasks-and-back-stack.html ясно объясняет, как это работает (внимание к полужирному тексту ниже; я также доказал это с помощью собственной отладки):
"Например, предположим, что задний стек задачи состоит из корневого действия A с действиями B, C и D сверху ( стек ABCD; D сверху ). Намерение приходит для активность типа D. Если в D по умолчанию установлен «стандартный» режим запуска, запускается новый экземпляр класса, и стек становится ABCDD. Однако, если режим запуска D - «singleTop», существующий экземпляр D получает намерение через onNewIntent (), потому что он находится на вершине стека - стек остается ABCD. Однако, , если приходит намерение для действия типа B, тогда новый экземпляр B добавляется в стек, даже если его запуск режим "singleTop". "
Другими словами, запуск действия через SINGLE_TOP будет повторно использовать существующее действие, только если оно уже находится на вершине стека . Это не будет работать, если другое действие в той же задаче находится наверху (например, действие, которое выполняет startActivity (SINGLE_TOP)); вместо этого будет создан новый экземпляр.
Вот два способа исправить это , чтобы получить желаемое поведение SINGLE_TOP, основная цель которого - повторно использовать существующее действие вместо создания нового ...
Первый способ (как описано в разделе комментариев принятых
ответ): Вы можете добавить режим запуска «singleTask» в свою активность. Это вызовет onNewIntent (), потому что singleTask означает, что в данной задаче может быть только ОДИН экземпляр конкретного действия. Это несколько хакерское решение, потому что, если вашему приложению требуется несколько экземпляров этого действия в конкретной ситуации (как я это делаю для своего проекта), вы облажались.
Второй способ (лучше):
Вместо FLAG_ACTIVITY_SINGLE_TOP используйте FLAG_ACTIVITY_REORDER_TO_FRONT. Это позволит повторно использовать существующий экземпляр действия, переместив его на вершину стека (onNewIntent () будет вызываться, как и ожидалось).
Основная цель FLAG_ACTIVITY_SINGLE_TOP - предотвратить создание нескольких экземпляров Activity. Например, когда эта деятельность может быть запущена через намерение, которое приходит извне основной задачи вашего приложения. Для внутреннего переключения между действиями в моем приложении я обнаружил, что вместо этого обычно используется FLAG_ACTIVITY_REORDER_TO_FRONT.