Android: FLAG_ACTIVITY_CLEAR_TOP и Android: launchMode = "singleInstance" - PullRequest
4 голосов
/ 05 мая 2011

Я думаю, что только что обнаружил действительно странную ошибку ... но это может быть какая-то особенность, о которой я никогда не слышал ..

В моем приложении, если у меня есть активность на AndroidManifest сandroid: launchMode = "singleInstance", когда вы пытаетесь "очистить" стек до определенной точки с помощью следующего кода:

    Intent intent = new Intent(this, Xpto.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
            | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

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

Пример:

A -> B -> C

Затем из CI вызвать A с Intent.FLAG_ACTIVITY_SINGLE_TOP |Intent.FLAG_ACTIVITY_CLEAR_TOP с одним экземпляром в манифесте.Он идет к A, но только выводит его на передний план ... и не заканчивает C и B.

Может кто-нибудь объяснить это поведение?

Класс Xpto, который я вызываю, находится в то времякорень активности стека.

Спасибо

1 Ответ

3 голосов
/ 18 февраля 2012

прочитав эту ветку:

http://groups.google.com/group/android-developers/browse_thread/thread/5eb400434e2c35f4

кажется, что:

"Текущий запущенный экземпляр действия B в приведенном выше примере либо получит новыйнамерение, что вы начинаете здесь в его методе onNewIntent (), или сами завершаете и перезапускаете с новым намерением. Если он объявил свой режим запуска «множественным» (по умолчанию) и вы не установили FLAG_ACTIVITY_SINGLE_TOP в том же самом намерении,затем он будет завершен и заново создан; для всех других режимов запуска или если установлен FLAG_ACTIVITY_SINGLE_TOP, тогда это намерение будет доставлено в onNewIntent () текущего экземпляра. "

, что означает, что вам нужно установить launchModeдля нескольких экземпляров и использовать только FLAG_ACTIVITY_CLEAR_TOP.

Intent intent = new Intent(this, Xpto.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

В описанном вами сценарии операции B и C не завершаются при запуске действия A (которое является корневым действием).В документации описано, что при установленном режиме запуска singleInstance и установленном флаге FLAG_ACTIVITY_SINGLE_TOP действия B и C НЕ будут завершены.Если вы хотите завершить действия B и C, вы должны установить режим запуска на несколько экземпляров и НЕ устанавливать флаг FLAG_ACTIVITY_SINGLE_TOP.

...