Жизненный цикл Activity Stack (часть 2)

    Как и договаривались в первой части статьи, в этой мы будем рассматривать инструменты для изменения стандартного поведения Activity Stack.

    Вся теория по сегодняшей теме присутствует на developer.android.com/guide/topics/manifest/activity-element.html, я буду кое-где на неё ссылаться, а мы постараемся разобраться как оно работает на деле и выяснить, в каких ситуациях это можно использовать в реальной жизни.

    Некоторые параметры могут быть добавлены как в AndroidManifest'е, так и Intent-флагом динамически в коде:
    intent.setFlags(Intent.FLAG_ACTIVITY_*);
    

    android:launchMode


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

    «standard» и «singleTop» (FLAG_ACTIVITY_SINGLE_TOP)

    "standard" — это поведение по умолчанию. Система всегда создаёт новую Activity и добавляет её в верх стэка.
    Изменим нашу ActivityA так, чтобы она вместо перехода на ActivityB стартовала себя же снова.

    («standard») A->A->back->back:
    *** Стартуем приложение ***
    INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 28371
    INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=28410 uid=10060 gids={1028}
    DEBUG/ActivityA(28410): onCreate()
    DEBUG/ActivityA(28410): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +2s64ms
    
    *** Вызов ActivityA ***
    INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 28410
    DEBUG/ActivityA(28410): onCreate()
    DEBUG/ActivityA(28410): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +739ms
    DEBUG/ActivityA(28410): onStop()
    
    *** Нажали back ***
    DEBUG/ActivityA(28410): onStart()
    DEBUG/ActivityA(28410): onStop()
    DEBUG/ActivityA(28410): onDestroy()
    
    *** Нажали back ***
    DEBUG/ActivityA(28410): onStop()
    DEBUG/ActivityA(28410): onDestroy()
    *** Выход на Home screen***
    

    Видим, что в стэке было 2 одинаковых Activity и только после двух нажатий back процесс умер.

    Модификатор "singleTop" защищает от дублирования Activity, которая находятся в вершине стэка, при её повторном вызове.

    («singleTop») A->A->back:
    *** Стартуем приложение ***
    INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 31016
    INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=31070 uid=10060 gids={1028}
    DEBUG/ActivityA(31070): onCreate()
    DEBUG/ActivityA(31070): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s296ms
    
    *** Вызов ActivityA ***
    INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 31070
    DEBUG/ActivityA(31070): onNewIntent()
    
    *** Нажали back ***
    DEBUG/ActivityA(31070): onStop()
    DEBUG/ActivityA(31070): onDestroy()
    *** Выход на Home screen***
    

    Новая Activity не была создана, вместо этого был вызов onNewIntent(). По первому back мы вышли из приложения.

    «singleTask» и «singleInstance»

    Модификаторы "singleTask" и "singleInstance" не разрешают иметь более одной сущности одной Activity. Отличаются они способностью иметь вместе с собой в task'е другие Activity.

    («singleTask») A->B->C->A->back:
    *** Стартуем приложение ***
    INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 1496
    INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=1529 uid=10060 gids={1028}
    DEBUG/ActivityA(1529): onCreate()
    DEBUG/ActivityA(1529): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s769ms
    
    *** Вызов ActivityB ***
    INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 1529
    DEBUG/ActivityB(1529): onCreate()
    DEBUG/ActivityB(1529): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +524ms
    DEBUG/ActivityA(1529): onStop()
    
    *** Вызов ActivityC ***
    INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 1529
    DEBUG/ActivityC(1529): onCreate()
    DEBUG/ActivityC(1529): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +267ms
    DEBUG/ActivityB(1529): onStop()
    
    *** Вызов ActivityA ***
    DEBUG/ActivityB(1529): onDestroy()
    DEBUG/ActivityA(1529): onNewIntent()
    DEBUG/ActivityA(1529): onStart()
    DEBUG/ActivityC(1529): onStop()
    DEBUG/ActivityC(1529): onDestroy()
    
    *** Нажали back ***
    11-13 00:08:00.039: DEBUG/ActivityA(1529): onStop()
    11-13 00:08:00.039: DEBUG/ActivityA(1529): onDestroy()
    *** Выход на Home screen***
    

    При повторном переходе на ActivityA система уничтожила все Activity, которые были выше её в стэке. Нажатие back вывело нас на Home Screen.

    («singleInstance») A->B->C->A->back->back->back:
    *** Стартуем приложение ***
    11-13 00:12:27.132: INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 2418
    11-13 00:12:27.859: INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=2438 uid=10060 gids={1028}
    11-13 00:12:28.332: DEBUG/ActivityA(2438): onCreate()
    11-13 00:12:28.457: DEBUG/ActivityA(2438): onStart()
    11-13 00:12:29.254: INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s606ms
    
    *** Вызов ActivityB ***
    11-13 00:12:32.195: INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 2438
    11-13 00:12:32.679: DEBUG/ActivityB(2438): onCreate()
    11-13 00:12:32.824: DEBUG/ActivityB(2438): onStart()
    11-13 00:12:33.394: INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +897ms
    11-13 00:12:33.547: DEBUG/ActivityA(2438): onStop()
    
    *** Вызов ActivityC ***
    11-13 00:12:36.257: INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 2438
    11-13 00:12:36.507: DEBUG/ActivityC(2438): onCreate()
    11-13 00:12:36.582: DEBUG/ActivityC(2438): onStart()
    11-13 00:12:37.343: INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +989ms
    11-13 00:12:37.695: DEBUG/ActivityB(2438): onStop()
    
    *** Вызов ActivityA ***
    11-13 00:12:38.660: INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 2438
    11-13 00:12:38.734: DEBUG/ActivityA(2438): onNewIntent()
    11-13 00:12:38.734: DEBUG/ActivityA(2438): onStart()
    11-13 00:12:39.789: DEBUG/ActivityC(2438): onStop()
    
    *** Нажали back ***
    11-13 00:12:41.425: DEBUG/ActivityC(2438): onStart()
    11-13 00:12:42.250: DEBUG/ActivityA(2438): onStop()
    11-13 00:12:42.250: DEBUG/ActivityA(2438): onDestroy()
    
    *** Нажали back ***
    11-13 00:12:52.332: DEBUG/ActivityB(2438): onStart()
    11-13 00:12:52.894: DEBUG/ActivityC(2438): onStop()
    11-13 00:12:52.898: DEBUG/ActivityC(2438): onDestroy()
    
    *** Нажали back ***
    11-13 00:12:55.617: DEBUG/ActivityB(2438): onStop()
    11-13 00:12:55.617: DEBUG/ActivityB(2438): onDestroy()
    *** Выход на Home screen***
    

    Повторный переход на ActivityA не вызвал цепных реакций, но открыл отдельный task с одной единственной ActivityA. Он был завершён по первому нажатию back. Ещё двух нажатий хватило, чтобы выйти на Home Screen, т.к. единственная сущность ActivityA была уничтожена выше и возврата к ней не было. Внешне переход от ActivityA к ActivityB и от ActivityC к ActivityA (т.е. переход между разными task'ами внутри одного процесса) выглядил как смена приложения, т.е. сворачивание одной Activity и «выпрыгивание» нового вместо более плавного перехода.

    android:noHistory (FLAG_ACTIVITY_NO_HISTORY)


    Значение по умолчанию — false. Если true, то к остановленной Activity вернуться будет нельзя.
    Параметр применён к ActivityA со значением true:
    <activity android:name=".ActivityA" android:noHistory="true">
    

    A->B->back:
    *** Стартуем приложение ***
    INFO/ActivityManager(249): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 4875
    INFO/ActivityManager(249): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=4915 uid=10060 gids={1028}
    DEBUG/ActivityA(4915): onCreate()
    DEBUG/ActivityA(4915): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +1s383ms
    
    *** Вызов ActivityB ***
    INFO/ActivityManager(249): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 4915
    DEBUG/ActivityB(4915): onCreate()
    DEBUG/ActivityB(4915): onStart()
    INFO/ActivityManager(249): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +877ms
    DEBUG/ActivityA(4915): onStop()
    
    *** Нажали back ***
    DEBUG/ActivityA(4915): onDestroy()
    DEBUG/ActivityB(4915): onStop()
    DEBUG/ActivityB(4915): onDestroy()
    *** Выход на Home screen***
    

    Судя по моменту запуска onDestroy() у ActivityA, она оставалась в памяти даже после того, как было вызвано ActivityA.onStop(), хотя возврат к ней уже не был возможен.

    Параметр удобно использовать, если нужно показать лого при запуске приложения и больше к нему не возвращаться.

    android:clearTaskOnLaunch и android:finishOnTaskLaunch


    Параметр clearTaskOnLaunch при значении true будет обязывать систему уничтожать все не корневые Activity у стэка (а точнее у конкретного task'а) при повторном запуске приложения. Имеет смысл применять только для корневой Activity, поэтому в примере, с которого снимался лог, я добавил его к ActivityA:
    <activity android:name=".ActivityA" android:clearTaskOnLaunch="true">
    

    App start->A->B->C->Home->App start:
    *** Стартуем приложение ***
    INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 476
    DEBUG/ActivityA(3412): onCreate()
    DEBUG/ActivityA(3412): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +295ms
    
    *** Вызов ActivityB ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 3412
    DEBUG/ActivityB(3412): onCreate()
    DEBUG/ActivityB(3412): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +140ms
    DEBUG/ActivityA(3412): onStop()
    
    *** Вызов ActivityC ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 3412
    DEBUG/ActivityC(3412): onCreate()
    DEBUG/ActivityC(3412): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +131ms
    DEBUG/ActivityB(3412): onStop()
    
    *** Нажали Home ***
    INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/com.android.launcher2.Launcher u=0} from pid 250
    DEBUG/ActivityC(3412): onStop()
    
    *** Запустили приложение из меню приложений повторно ***
    INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 476
    DEBUG/ActivityC(3412): onDestroy()
    DEBUG/ActivityB(3412): onDestroy()
    DEBUG/ActivityA(3412): onStart()
    

    Видим что при повторном запуске приложения, Android уничтожил из памяти дочерние ActivityB и ActivityC. Имеем также в виду, что возврат к приложению через меню Recents (долгий tap по кнопке Home) не инициирует Intent LAUNCHER, а потому случится возврат к ActivityC.

    Точно такого же поведения можно добиться с помощью параметра finishTaskOnLaunch. Android уничтожит те Activity при повторном запуске приложения, у которых значение этого параметра будет true. Т.е. для нашего примера достаточно прописать его в ActivityB и ActivityC, чтобы увидеть тот же лог:
    <activity android:name=".ActivityB" android:finishOnTaskLaunch="true"/>
    <activity android:name=".ActivityC" android:finishOnTaskLaunch="true"/>
    

    Оба параметра имеют значение false по умолчанию.

    Один из возможных случаев применения — реализовать невозможность возврата в остановленную Activity в сочетании с параметром excludeFromRecents (невключение Activity в меню Recents). Хотя, полагаю, есть и более специфичные или, наоборот, простые случаи.

    android:parentActivityName


    Этим параметром можно сделать родителем конкретной Activity любую нужную нам. Но есть некоторая оговорка, что возврат к нему будет происходить не по кнопке back, а по Navigation Up (http://developer.android.com/training/implementing-navigation/ancestral.html), как, например в Action Bar'e. Но мы, чтобы не заморачиваться, переопределим onBackPressed() в ActivityC и сделаем ActivityA родителем ActivityC:
    Например:
    @Override
    public void onBackPressed() {
        onNavigateUp();
    }
    

    <activity 
            android:name=".ActivityC"
            android:parentActivityName=".ActivityA">
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".ActivityA" />
    </activity>
    

    A->B->C->back:
    *** Стартуем приложение ***
    INFO/ActivityManager(250): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 6620
    INFO/ActivityManager(250): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=6634 uid=10060 gids={1028}
    DEBUG/ActivityA(6634): onCreate()
    DEBUG/ActivityA(6634): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +895ms
    
    *** Вызов ActivityB ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 6634
    DEBUG/ActivityB(6634): onCreate()
    DEBUG/ActivityB(6634): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +179ms
    DEBUG/ActivityA(6634): onStop()
    
    *** Вызов ActivityC ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 6634
    DEBUG/ActivityC(6634): onCreate()
    DEBUG/ActivityC(6634): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +144ms
    DEBUG/ActivityB(6634): onStop()
    
    *** Нажали back ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 6634
    DEBUG/ActivityB(6634): onDestroy()
    DEBUG/ActivityA(6634): onDestroy()
    DEBUG/ActivityA(6634): onCreate()
    DEBUG/ActivityA(6634): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +182ms
    DEBUG/ActivityC(6634): onStop()
    DEBUG/ActivityC(6634): onDestroy()
    

    Видим, что после нажатия back произошло даже больше того, что ожидалось. Были уничтожены не только те Activity, которые стояли выше родительской, то так же пересоздалась и она сама. Но в целом поведение ожидаемо.

    Применять разумно для того, чтобы дать пользователю выйти, к примеру, в главное меню после долгих странствий по дочерним Activity без многочисленных возвратов по кнопке back (в случае реализации, как положено, с Action Bar'ом).

    android:allowTaskReparenting и android:taskAffinity


    Параметр allowTaskReparenting разрешает привязать вызванную из task'а №1 Activity до этого созданную в task'e №2 (т.е. привязанную к нему) к task'у №1.
    Подготовка:
    <activity android:name=".ActivityA" android:launchMode="singleInstance" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".ActivityB"
              android:launchMode="singleTask" />
    <activity android:name=".ActivityC"
              android:launchMode="singleTask"  
              android:allowTaskReparenting="true"
              android:taskAffinity=".ActivityA" />
    

    На форму ActivityA добавим ещё одну кнопку, которая будет стартовать ActivityC.

    В файле манифеста мы разрешили ActivityC менять родителя, если на это претендует ActivityA, которая здесь является отдельным task'ом по причине android:launchMode="singleInstance".

    App start->A->B->C->Home->App start->A->C->back:
    *** Стартуем приложение ***
    INFO/ActivityManager(250): START {flg=0x10000000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 10495
    INFO/ActivityManager(250): Start proc com.habrahabr.ActivityStackLifeCycle for activity com.habrahabr.ActivityStackLifeCycle/.ActivityA: pid=10524 uid=10060 gids={1028}
    DEBUG/ActivityA(10524): onCreate()
    DEBUG/ActivityA(10524): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityA: +761ms
    
    *** Вызов ActivityB ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityB u=0} from pid 10524
    DEBUG/ActivityB(10524): onCreate()
    DEBUG/ActivityB(10524): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityB: +225ms
    DEBUG/ActivityA(10524): onStop()
    
    *** Вызов ActivityC ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 10524
    DEBUG/ActivityC(10524): onCreate()
    DEBUG/ActivityC(10524): onStart()
    INFO/ActivityManager(250): Displayed com.habrahabr.ActivityStackLifeCycle/.ActivityC: +204ms
    DEBUG/ActivityB(10524): onStop()
    
    *** Нажали Home***
    INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/com.android.launcher2.Launcher u=0} from pid 250
    DEBUG/ActivityC(10524): onStop()
    
    *** Запустили приложение из меню приложений повторно ***
    INFO/ActivityManager(250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityA u=0} from pid 476
    DEBUG/ActivityA(10524): onNewIntent()
    DEBUG/ActivityA(10524): onStart()
    
    *** Вызов ActivityC ***
    INFO/ActivityManager(250): START {cmp=com.habrahabr.ActivityStackLifeCycle/.ActivityC u=0} from pid 10524
    DEBUG/ActivityC(10524): onNewIntent()
    DEBUG/ActivityC(10524): onStart()
    DEBUG/ActivityA(10524): onStop()
    
    *** Нажали back ***
    DEBUG/ActivityA(10524): onStart()
    DEBUG/ActivityC(10524): onStop()
    DEBUG/ActivityC(10524): onDestroy()
    

    До нажатия Home у нас было два сущности: Task1[A], Task2[B,C]. После повторного запуска приложения мы из ActivityA обратились к ActivityC, т.е. к Task2, который далее, не будь прописаны allowTaskReparenting и taskAffinity, вёл бы себя как отдельное приложение и по нажатию back вернул бы нас к своему корневому ActivityB. Благодаря параметрам, кнопка back вывела нас обратно в Task1.

    В реальной жизни редко бывает необходимость строить такие сложные схемы работы внутри одного приложения, поэтому логичнее представить на месте Task1 и Task2 отдельные приложения, одно из которых вызывает Activity другого для выполнения короткой задачи и после нажатия back получает обратно контроль над экраном устройства.

    android:alwaysRetainTaskState


    По умолчанию система уничтожает task вместе с его Activity спустя некоторое время («such as 30 minutes» © developer.android.com), если пользователь к нему не обращался. Их можно заставить жить вечно (за исключением случаев с нехваткой памяти), определив для таких Activity параметр alwaysRetainTaskState со значение true. Так описано в теории, и сложно представить здесь некий подвох, поэтому тестов не проводил.
    Добавлено: Оказалось, что подвох всё-таки есть, спасибо ara89 за его комментарий. Начиная с Android 4.0 (API level 14) Activity прекратили уничтожаться и этот параметр стал бесполезен. Diff между 2.3.7 и 4.0.1 можно посмотреть здесь (обратить внимание на поле ACTIVITY_INACTIVE_RESET_TIME). Впрочем, на это создан баг в трэкере по Android'у, но он всё ещё в статусе New и без Owner'а.

    Жизненный цикл Activity Stack (часть 1)
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 6

    • UFO just landed and posted this here
        0
        Оу, спасибо, я вот, оказывается, ложную информацию дал. Не каждому параметру есть свой Intent-флаг. Я добавил в заголовки флаги там, где они коррелируют (получилось совсем немного таких), но побоялся добавлять те, которые не проверял сам, хотя у них есть сходство по документанции.
        0
        По умолчанию система уничтожает task вместе с его Activity спустя некоторое время («such as 30 minutes» © developer.android.com)

        это было верно для Android <=2.3, а после таск перестал уничтожаться совсем. Подробнее тут
          0
          Интересно… Странно, что об этом никакого упоминания в документации, хотя и есть изменения на той странице после выхода 4.0. Есть вероятность, что это до сих пор незафикшенный баг? Мы-то знаем, как они их «быстро» исправляют :)
            0
            ну это скорее не баг, а недосказанность в документации )
              0
              Добавил результаты небольшого расследования в конец статьи :) Спасибо.
              До конца непонятно, почему произошло изменение, конкретный коммит найти оказалось достаточно сложно.

        Only users with full accounts can post comments. Log in, please.