Android - режим запуска singleTask или singleInstance? [закрыто]

84

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

Однако я хочу, чтобы у этого действия поиска был только один экземпляр в стеке, чтобы пользователи могли выполнять поиск несколько раз, и щелчок по нему вернул бы их к предыдущему представлению, в котором они были до начала поиска (вместо того, чтобы возвращаться к предыдущим результатам поиска)

оба режима запуска singleTask и singelInstance, похоже, делают то, что я хочу, поэтому я не уверен, какой из них мне следует использовать для этой цели и почему?

Кман
источник

Ответы:

141

На странице " Основы приложений " руководства для разработчиков Android:

По умолчанию все действия в приложении похожи друг на друга, то есть есть предпочтение, чтобы все они принадлежали одной задаче.

Действие «singleInstance» является единственным действием в своей задаче. Если он запускает другое действие, это действие будет запущено в другой задаче независимо от его режима запуска - как если бы FLAG_ACTIVITY_NEW_TASK был в намерении. Во всем остальном режим singleInstance идентичен режиму singleTask.

Как отмечалось выше, никогда не бывает более одного экземпляра действия «singleTask» или «singleInstance», поэтому ожидается, что этот экземпляр будет обрабатывать все новые намерения. Действие «singleInstance» всегда находится на вершине стека (поскольку это единственное действие в задаче), поэтому оно всегда в состоянии обработать намерение. Однако действие "singleTask" может иметь или не иметь другие действия в стеке над ним. Если это так, значит, он не в состоянии обработать намерение, и намерение отбрасывается. (Даже если намерение отброшено, его прибытие привело бы к тому, что задача переместилась бы на передний план, где она и останется.)

4 действия в задаче

Поскольку в любом из режимов запуска никогда не бывает более одного экземпляра Activity, кнопка «Назад» всегда приведет вас к существующему экземпляру Activity в вашем случае.

Важное отличие состоит в том, что для «singleTask» не требуется создание новой задачи для новых Activity, запускаемых при выборе чего-либо. И ему не придется каждый раз удалять эту новую задачу на кнопке возврата.

Поскольку ваш стек Activity относится к одной пользовательской «задаче», и не похоже, что у вас сложная структура Intent, где singleInstance может быть полезен для их обработки, я бы предложил использовать режим запуска singleTask.

Вот хорошее сообщение в блоге для получения дополнительной информации, а также указание на изображение: Серия «Действия и задачи Android» - Введение в компонентную модель пользовательского интерфейса Android.

Гузба
источник
4
Благодаря! похоже на хорошее чтение ... дело в том, что я понял, что я действительно ХОЧУ несколько экземпляров активности, и только когда активностью переднего плана является поисковая активность и выполняется другой поиск, если он использует это существующее действие (например, как работает рынок). за это singeTop - это именно то, что мне нужно, но в любом случае спасибо за помощь =) спасибо
Kman
1
Привет спасибо. Этот хорошо написанный пост помог мне в крайнем случае.
icecreamman
Спасибо за детали, особенно за этот (даже если намерение отброшено, его появление заставило бы задачу выйти на передний план, где она и останется.) , Что мгновенно устраняет мое замешательство. Я просто подумал о том, что, если однозадачное действие не находится наверху стека, а я все еще хочу перейти к нему без указания FLAG_ACTIVITY_CLEAR_TOP .
neevek 09
Обязательно прочтите " androidsrc.net/android-activity-launch-mode-example "
Дирадж Химани,
30

По-простому -

singleTask:

Система создает новую задачу и инстанцирует действие в корне новой задачи. Однако, если экземпляр действия уже существует в отдельной задаче, система направляет намерение существующему экземпляру через вызов его onNewIntent()метода, а не создает новый экземпляр. Одновременно one instanceможет существовать только действие.

Примечание. Хотя действие начинается в новой задаче, кнопка «Назад» по-прежнему возвращает пользователя к предыдущему действию.

singleInstance-

То же, что и "singleTask", за исключением того, что система не запускает никаких других действий в задаче, содержащей экземпляр . Действие всегда является единственным и единственным участником своей задачи; любые действия, начатые этим, открываются в отдельной задаче .

Тарун Варшней
источник
4

singleTaskи singleInstanceдействия могут только начать задачу. Они всегда находятся в корне стека действий. Более того, устройство может одновременно хранить только один экземпляр активности - только одну такую ​​задачу.
для более android: launchMode .

Рупеш Ядав
источник
1
последнее предложение верно для singleInstance, а не для singleTask
Сердар Саманджиоглу
@SerdarS. ценю ваш комментарий. Добавление дополнительных сведений singleTask- система создает новую задачу и инстанцирует действие в корне новой задачи. Однако, если экземпляр действия уже существует в отдельной задаче, система направляет намерение существующему экземпляру через вызов его onNewIntent()метода, а не создает новый экземпляр. Одновременно может существовать только один экземпляр действия. подробнее developer.android.com
Рупеш Ядав
Понял, значит, я ошибался. Извините, что беспокою.
Сердар Саманджиоглу