Затем создал клон 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”. Когда они вызываются из одного и того же приложения.
В следующей статье рассмотрим это же поведение, когда они вызываются из разных приложений. Дабы еще лучше понять эту тему задач, стека и Активностей в них.
Комментариев нет:
Отправить комментарий