Затем создал клон AP0003 назвав его естественно AP0004
Правда раскрасил я этот клон в более нежные цвета, но от этого не менее дикие
Так же в приложении AP004 из Активности А, можно запустить Активность С в приложении AP003. В коде приложения AP0003 есть некоторые логические “ошибки”, которые, однако помогают понять логику работу различных параметров launchMode.
Сейчас, пока, рассмотрим только параметры “standard” и “singleTop”. Мои приложения продолжают эволюционировать ну или мутировать, и уже превращаются в неких монстриков.
Похоже далее уже придется выводить новый вид.
Итак в приложении AP0004 Активность D имеет режим запуска по умолчанию, то есть “standard”. А в приложении AP0003 Активность D имеет режим запуска “singleTop”.
Кроме того, код Активности С в приложении АР0003 так же был модифицирован, чтобы показать как Активности попадают в разные задачи.
И так запускаем приложение AP0004 и смотрим скрины и логи.
Смотрим логи
Все как и раньше, как и должно быть, только я добавил еще в методе onResume вывод в лог ID задачи (TaskID). Код приведу чуть позже.
Теперь последовательно запускаем Активности В, С и D.
Посмотрим логи.
Здесь все тоже стандартно и обычно. Активность D запущена. И в нашей задаче сейчас 4 Активности: A-B-C-D.
Теперь нажмем кнопку Start Activity D.
Был запущен еще один экземпляр Активности D, поскольку у нее launcMode стандартный. И сейчас наш стек имеет вид A-B-C-D-D. Посмотрим логи.
Из логов видно, что была создана вторая Активность D и помещена на вершину стека, а предыдущая Активность D, теперь находится в остановленном состоянии. Ради эксперимента запустим еще одну Активность D.
Глянем логи.
Из логов видно что было создано три Активности 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.
И так в нашей задаче сейчас 4 Активности A-B-C-D. Активность D находится на вершине стека.
Посмотрим логи
Как видно была запущена Активность D. В нашей задаче 4 активности. На это обращаем внимание. Кроме того ID нашей задачи сейчас 16. Дополнительная информация в логе, это результаты работы модифицированного кода Активности С в приложении AP0003. К этому мы вернемся чуть позже. А пока концентрируемся на том, что Активность D была запущена.
Теперь нажмем кнопку Start Activity D
И посмотрим логи
Как видим Активность D не была создана заново, а просто приостановлена и снова восстановлена. В нашей задаче по прежнему 4 Активности и стек по прежнему имеет вид A-B-C-D.
На всякий случай сделаем еще один контрольный выстрел и нажмем на кнопку Start Activity D еще разок. И посмотрим логи, так как скрин останется тем же.
И так поскольку для запуска Активности D определен параметр “singleTop”, то новые экземпляры Активности D не создаются, пока она находится на вершине стека текущей задачи.
Теперь чтобы еще глубже понять эту тему, нажмем кнопку Start Activity A.
Запустилась Активность А. И сейчас наш стек имеет вид A-B-C-D-A. Это тоже все как и должно быть, все как описано в документации.
Посмотрим логи
Теперь опять последовательно запустим Активности B-C-D
Теперь наш стек имеет вид A-B-C-D-A-B-C-D, то есть в нашей задаче сейчас 8 Активностей. Что и подтверждает скрин.
Собственно все как в матчасти. Если Активность имеет параметр запуска singleTop, то она может находится в стеке много раз, причем в стеках разных задач. Единственное исключение, ее экземпляр в данной задаче не может быть создан, если она находится в данный момент на вершине стека данной задачи.
Еще раз напомним матчасть
- “standard” – (по умолчанию). Система создает новый экземпляр активности в задаче из которой она была запущена и направляет интент на нее. Может быть много экземпляров Активности. Каждый экземпляр может принадлежать различным задачам. И любая задача может иметь множество экземпляров этой Активности.
- “singleTop” – если экземпляр активности уже существует на вершине текущей задачи, то система направляет интент на этот экземпляр хотя, и, хотя и вызывает метод onNewIntent(), новый экземпляр Активности создаваться не будет. Новый экземпляр Активности создается в стеке только в том случае, если экземпляра данной Активности нет на вершине стека. Может быть много экземпляров Активности. Каждый экземпляр может принадлежать различным задачам. И любая задача может иметь множество экземпляров этой Активности.
И так мы пока рассмотрели простое поведение Активностей с параметрами запуска “standard” и “singleTop”. Когда они вызываются из одного и того же приложения.
В следующей статье рассмотрим это же поведение, когда они вызываются из разных приложений. Дабы еще лучше понять эту тему задач, стека и Активностей в них.
Комментариев нет:
Отправить комментарий