Android что такое launchmode

Русские Блоги

Четыре способа Android: launchMode

Действие имеет следующие четыре режима запуска:

1.standard

Стандартный режим является режимом запуска по умолчанию. Вам не нужно настраивать атрибут android: launchMode для . Конечно, вы также можете указать значение как стандартное.

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

TextView в нашем интерфейсе FirstActivity используется для отображения серийного номера текущего экземпляра Activity, а кнопка используется для перехода к следующему интерфейсу FirstActivity.

Затем нажимаем кнопку несколько раз подряд, появится следующее явление:

Мы заметили, что все они являются экземплярами FirstActivity, но серийные номера разные, и нам нужно дважды подряд нажать клавишу возврата, чтобы вернуться к первому FristActivity. Принцип стандартного режима показан на рисунке ниже:

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

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

2.singleTop

Мы видим, что этот результат отличается от стандартного. Три серийных номера совпадают, что означает, что используется один и тот же экземпляр FirstActivity; если вы нажмете кнопку «Назад», программа немедленно завершится, что означает, что в текущая структура стека. Принцип работы режима singleTop показан на рисунке ниже:

Как показано на рисунке выше, при переходе система сначала ищет экземпляр FirstActivity в структуре стека, чтобы увидеть, есть ли экземпляр FirstActivity наверху стека. Может быть, у друзей возникнут вопросы. Я вижу только одно действие в стеке. Что, если их несколько? Что делать, если оно не находится на вершине стека? Мы будем использовать пример, чтобы подтвердить все сомнения.

Давайте создадим новое Activity с именем SecondActivity, как показано ниже:

Затем измените предыдущий код перехода FirstActivity на:

Да, FirstActivity перейдет к SecondActivity, а SecondActivity перейдет к FirstActivity. Результаты демонстрации следующие:

Мы видим, что серийные номера двух FirstActivity различаются, что доказывает, что новый экземпляр FirstActivity создается при переходе от SecondActivity к FirstActivity. Принципиальная схема выглядит следующим образом:

Мы видим, что при переходе от SecondActivity к FirstActivity система обнаруживает, что существует экземпляр FirstActivity, но он не находится на вершине стека, поэтому он регенерирует экземпляр.

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

3.singleTask

На основании вышеизложенного мы модифицируем атрибут android: launchMode = «singleTask» в FirstActivity. Результаты демонстрации следующие:

Мы заметили, что в приведенном выше процессе серийный номер FirstActivity не изменился, но серийный номер SecondActivity не уникален, что указывает на то, что при переходе от SecondActivity к FirstActivity новый экземпляр не создается, а выполняется переход от FirstActivity к SecondActivity. экземпляр создан. Принципиальная схема режима singleTask показана на рисунке ниже:

Читайте также:  Дополнительная кнопка для андроид

Нижняя часть рисунка является результатом изменения структуры стека после перехода SecondActivity к FirstActivity. Мы заметили, что SecondActivity исчезла. Правильно, во время этого перехода система обнаружила, что был экземпляр FirstActivity, поэтому он больше не генерировался. Новый экземпляр, но все экземпляры Activity в FirstActivity извлекаются из стека, и FirstActivity становится верхним объектом стека, который отображается перед экраном. Может быть, у друзей есть вопросы, если SecondActivity также установлен в режим singleTask, может ли экземпляр SecondActivity быть уникальным? В нашем примере это невозможно, потому что каждый раз, когда вы переходите от SecondActivity к FirstActivity, экземпляр SecondActivity вынужден выскакивать из стека. В следующий раз, когда FirstActivity переходит к SecondActivity, существующий экземпляр SecondActivity не может быть найден, поэтому он должен будет создан Новый экземпляр. Но если у нас есть ThirdActivity, пусть SecondActivity и ThirdActivity переходят друг к другу, тогда экземпляр SecondActivity может быть гарантированно уникальным.

Это режим singleTask.Если соответствующий экземпляр Activity найден, все другие экземпляры Activity выше этого экземпляра Activity будут извлечены из стека, в результате чего этот экземпляр Activity станет верхним объектом стека и будет отображаться в передней части экрана.

4.singleInstance

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

Мы изменяем launchMode = «standard» для FirstActivity и launchMode = «singleInstance» для SecondActivity. Поскольку задействовано несколько структур стека, нам нужно отображать идентификатор текущей структуры стека в каждом действии, поэтому мы добавляем следующий код для каждого Мероприятия:

Затем мы снова демонстрируем этот процесс:

Мы обнаружили, что эти два экземпляра Activity были помещены в разные структуры стека.Схема singleInstance выглядит следующим образом:

Мы видим, что при переходе от FirstActivity к SecondActivity новая структура стека повторно активируется для размещения экземпляра SecondActivity, а затем нажимается кнопка возврата, чтобы вернуться к исходной структуре стека; нижняя часть рисунка показывает, что он снова переходит в SecondActivity Перейдите к FirstActivity. В это время система сгенерирует экземпляр FirstActivity в исходной структуре стека, а затем дважды откатится. Обратите внимание, что вместо выхода он возвращается к SecondActivity. Почему? Это происходит потому, что когда мы переходим от SecondActivity к FirstActivity, нашей отправной точкой становится структура стека, в которой находится экземпляр SecondActivity.Таким образом, нам нужно «вернуться» к этой структуре стека.

Если мы изменим значение launchMode для FirstActivity на любое из singleTop, singleTask, singleInstance, процесс будет таким, как показано на рисунке:

Читайте также:  Лучшие pdf редакторы для андроид

Режим запуска singleInstance может быть самым сложным. Чтобы помочь вам понять, позвольте мне привести пример. Если у нас есть приложение для совместного использования, ShareActivity является входом Activity, а также Activity, который может быть вызван другими приложениями. Установите режим запуска singleInstance, а затем вызовите его в других приложениях. Редактируем конфигурацию ShareActivity:

Затем мы запускаем Activity в других приложениях, например:

Когда мы открываем ShareActivity и нажимаем кнопку «Назад», чтобы вернуться к исходному интерфейсу, ShareActivity существует как независимый объект. Если мы откроем приложение для совместного использования в это время, мы сможем увидеть результаты, не создавая новый экземпляр ShareActivity, потому что система автоматически найди это Существование используется напрямую. Вы можете распечатать taskId в ShareActivity, чтобы увидеть эффект. Что касается этого процесса, схематическая диаграмма выглядит следующим образом:

(1) «Когда мы открываем ShareActivity, а затем нажимаем кнопку« Назад », чтобы вернуться к исходному интерфейсу», разве это не должна быть кнопка возврата? Это должна быть кнопка HOME, верно?

Две ситуации: 1. Сначала запустите приложение общего доступа, сделайте его фоновым нажатием клавиши HOME, затем запустите приложение MainActivity и вызовите ShareActivity в MainActivity.Идентификатор этого ShareActivity такой же, как и предыдущий идентификатор ShareActivity.

2 Сначала запустите приложение приложения, вызовите ShareActivity в MainActivity, поместите его в фоновый режим с помощью клавиши HOME, а затем запустите приложение общего доступа, идентификатор запущенного ShareActivity такой же, как и предыдущий идентификатор ShareActivity

(2) «Когда мы открываем ShareActivity, а затем нажимаем кнопку« Назад », чтобы вернуться к исходному интерфейсу, ShareActivity существует как независимый объект. Если мы откроем приложение для совместного использования в это время, мы сможем увидеть результат, не создавая новый экземпляр ShareActivity, потому что система будет автоматически найдена, и она будет использоваться напрямую, если она существует.Вы можете распечатать taskId в ShareActivity, чтобы увидеть эффект.

Тест показывает, что taskId и ActivityId для запуска ShareActivity из MainActivity и возврата к исходному интерфейсу, а затем открытия общего приложения отличаются.

Источник

Android Launch Mode

There are four launch modes for activity.

  1. standard
  2. singleTop
  3. singleTask
  4. singleInstance

This is the default launch mode of activity. If you don’t set any launch mode to your activity, it will use the standard mode by default. It creates a new instance of activity every time even if activity instance is already present.

Suppose we have A, B, C, and D activities and your activity B has standard launch mode. Now again launching activity B

State of Activity Stack before launch B

State of Activity Stack after launch B

We can see that new instance of B is created again.

Читайте также:  Как стереть журнал звонков андроид

If an instance of activity already exists at the top of the current task, a new instance will not be created and the Android system will route the intent information through onNewIntent().
If an instance is not present on top of the task then a new instance will be created.

Suppose we have A, B, C, and D activities. A →B →C →D

If we launch C then a new instance of C will be created as it is not on top.
So it will look like A →B →C →D →C

Now suppose we have A →B →C →D →C like this
then we if again launch C activity then in this case new instance will not be created. Instead, we will receive the callback on onNewIntent() method.

An activity declared with launch mode as singleTask can have only one instance in the system (singleton). At a time only one instance of activity will exist.

If activity instance is not present then the new instance will be created and if the instance is already present in the system then the onNewIntent() method will receive the callback.

Suppose we have A, B, C activities( A →B →C ) and we are launching D that has a singleTask launch mode. In that case, the new instance of D will be created so the current state will look like this. ( A →B →C →D)

Now let suppose if we launch B that also have has a singleTask launch mode then current state will look like this.

Here old instance gets called and intent data route through onNewIntent() callback. Also, notice that C and D activities get destroyed here.

It is similar to singleTask except that no other activities will be created in the same task. If another Activity is called from this kind of Activity, a new Task would be automatically created to place that new Activity.

Case 1:

Suppose you have A, B, and C activities( A →B →C) and your activity D has a singleInstance launch mode. In this case, if we launch D then D will be launch in the diffrent task. New task for D will be created.

Task2 : D ( here D will be in the different task)

Now if you continue this and start E and D then Stack will look like

Case 2:

Suppose you have A, B, C activities in one task ( A →B →C)and activity D is in another task with launch mode singleInstance. In this case, if we launch D again then we will receive the callback in the onNewIntent() method of D activity.

Task2: D ( Here old instance gets called and intent data route through onNewIntent() callback)

Источник

Оцените статью