16 апреля 2014 г.

Задачи и обратный стек (Tasks and back stack). Часть 5 (практика)

В свое мега приложение AP0003, я добавил еще одну Активность D, чтобы все было как в классике, ну или почти как. Активности A,B,C,D последовательно запускают друг друга. Активность D может запустить Актиновсть A или же запустить саму себя.

Затем создал клон AP0003 назвав его естественно AP0004 Улыбка

Правда раскрасил я этот клон в более нежные цвета, но от этого не менее дикие Улыбка

Так же в приложении AP004 из Активности А, можно запустить Активность С в приложении AP003. В коде приложения AP0003 есть некоторые логические “ошибки”, которые, однако помогают понять логику работу различных параметров launchMode.

Сейчас, пока, рассмотрим только параметры “standard” и “singleTop”. Мои приложения продолжают эволюционировать ну или мутировать, и уже превращаются в неких монстриков.
Похоже далее уже придется выводить новый вид.

Итак в приложении AP0004 Активность D имеет режим запуска по умолчанию, то есть “standard”. А в приложении AP0003 Активность D имеет режим запуска “singleTop”.

Кроме того, код Активности С в приложении АР0003 так же был модифицирован, чтобы показать как Активности попадают в разные задачи.

И так запускаем приложение AP0004 и смотрим скрины и логи.

TSK0001

Смотрим логи

TSK0002

Все как и раньше, как и должно быть, только я добавил еще в методе onResume вывод в лог ID задачи (TaskID). Код приведу чуть позже.

Теперь последовательно запускаем Активности В, С и D.

TSK0003

TSK0004

TSK0005

Посмотрим логи.

TSK0006

Здесь все тоже стандартно и обычно. Активность D запущена. И в нашей задаче сейчас 4 Активности: A-B-C-D.

Теперь нажмем кнопку Start Activity D.

TSK0007

Был запущен еще один экземпляр Активности D, поскольку у нее launcMode стандартный. И сейчас наш стек имеет вид A-B-C-D-D. Посмотрим логи.

TSK0008

Из логов видно, что была создана вторая Активность D и помещена на вершину стека, а предыдущая Активность D, теперь находится в остановленном состоянии. Ради эксперимента запустим еще одну Активность D.

TSK0009

Глянем логи.

TSK0010

Из логов видно что было создано три Активности D. Сейчас наш стек имеет вид A-B-C-D-D-D.

И так мы пока рассмотрели простое поведение Активности по умолчанию.

Теперь рассмотрим поведение Активности D в приложении AP0003, для которой laucnMode в файле манифеста задан “singleTop”

Файл AndroidManifest.xml в приложении AP0003

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ap0003"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.GET_TASKS" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.ap0003.ActivityA"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.ap0003.ActivityB"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.example.ap0003.ActivityC"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="AP0003_ActC"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.ap0003.ActivityD"
            android:label="@string/app_name" android:launchMode="singleTop">
        </activity>
    </application>

</manifest>

В строке 41 для Активности D в параметре android:launchMode задано значение “singleTop”.

Посмотрим теперь поведение Активности D с этим параметром запуска.

Запускаем приложение AP003 и последовательно запускаем Активности B-C-D.

TSK0011

TSK0012

TSK0013


TSK0014

И так в нашей задаче сейчас 4 Активности A-B-C-D. Активность D находится на вершине стека.

Посмотрим логи

TSK0015

Как видно была запущена Активность D. В нашей задаче 4 активности. На это обращаем внимание. Кроме того ID нашей задачи сейчас 16. Дополнительная информация в логе, это результаты работы модифицированного кода Активности С в приложении AP0003. К этому мы вернемся чуть позже. А пока концентрируемся на том, что Активность D была запущена.

Теперь нажмем кнопку Start Activity D

TSK0016

И посмотрим логи

TSK0017

Как видим Активность D не была создана заново, а просто приостановлена и снова восстановлена. В нашей задаче по прежнему 4 Активности и стек по прежнему имеет вид A-B-C-D.

На всякий случай сделаем еще один контрольный выстрел и нажмем на кнопку Start Activity D еще разок. И посмотрим логи, так как скрин останется тем же.

TSK0018

И так поскольку для запуска Активности D определен параметр “singleTop”, то новые экземпляры Активности D не создаются, пока она находится на вершине стека текущей задачи.

Теперь чтобы еще глубже понять эту тему, нажмем кнопку Start Activity A.

TSK0019

Запустилась Активность А. И сейчас наш стек имеет вид A-B-C-D-A. Это тоже все как и должно быть, все как описано в документации.

Посмотрим логи

TSK0020

Теперь опять последовательно запустим Активности B-C-D

TSK0021

TSK0022


TSK0023

Теперь наш стек имеет вид A-B-C-D-A-B-C-D, то есть в нашей задаче сейчас 8 Активностей. Что и подтверждает скрин.

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

Еще раз напомним матчасть Улыбка
  • “standard” – (по умолчанию). Система создает новый экземпляр активности в задаче из которой она была запущена и направляет интент на нее. Может быть много экземпляров Активности. Каждый экземпляр может принадлежать различным задачам. И любая задача может иметь множество экземпляров этой Активности.

  • “singleTop” – если экземпляр активности уже существует на вершине текущей задачи, то система направляет интент на этот экземпляр хотя, и, хотя и вызывает метод onNewIntent(), новый экземпляр Активности создаваться не будет. Новый экземпляр Активности создается в стеке только в том случае, если экземпляра данной Активности нет на вершине стека. Может быть много экземпляров Активности. Каждый экземпляр может принадлежать различным задачам. И любая задача может иметь множество экземпляров этой Активности.

И так мы пока рассмотрели простое поведение Активностей с параметрами запуска “standard” и “singleTop”. Когда они вызываются из одного и того же приложения.
В следующей статье рассмотрим это же поведение, когда они вызываются из разных приложений. Дабы еще лучше понять эту тему задач, стека и Активностей в них.

Комментариев нет:

Отправить комментарий