Приложение всегда запускается заново из корневой активности вместо возобновления фонового состояния (Известная ошибка) - PullRequest
47 голосов
/ 17 февраля 2010

Я столкнулся именно с проблемой, упомянутой в этих ссылках:

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

У меня есть простое действие root с намерениями LAUNCHER и MAIN и ничего больше . Я начинаю другое действие с без флагов или чем-то еще в манифесте.

Я запускаю приложение (корневое действие) и оттуда запускаю второе действие. При нажатии кнопки «Домой» задача уходит в фоновый режим. При повторном запуске приложения (из Launcher или из-за удерживания кнопки Home для последних приложений) оно запускает новый экземпляр корневого действия поверх существующего стека.

Если я нажму кнопку «Назад», новое «корневое» действие закроется, и будет видно старое второе действие, что означает запуск корневого действия в той же задаче вместо вывода задачи на передний план.

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

Это происходит даже в других приложениях, загруженных с маркета. Метод ручной установки для меня не действует, он все равно запускается так же.

Ответы [ 5 ]

62 голосов
/ 15 мая 2012
    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
        // Activity was brought to front and not created, 
        // Thus finishing this will get us to the last viewed activity 
        finish(); 
        return; 
    } 

    // Regular activity creation code... 
} 
25 голосов
/ 17 февраля 2010

Это связано с тем, что намерения, используемые для запуска приложения, отличаются. Eclipse запускает приложение, используя намерение без действия и без категории. Программа запуска запускает приложение, используя намерение с действием android.intent.action.MAIN и категорией android.intent.category.LAUNCHER. Программа установки запускает приложение с действием android.intent.action.MAIN и без категории.

Кто бы ни отправил сообщение об ошибке, он, вероятно, должен был сформулировать его как просьбу об улучшении плагина Eclipse, поскольку он, очевидно, хотел, чтобы Eclipse имел возможность претендовать на роль средства запуска и запускать приложения, используя то же намерение, что и средство запуска. *

5 голосов
/ 03 февраля 2015

Вот решение:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) {
        finish();
        return;
    }

 Your code....
}

РЕДАКТИРОВАТЬ: у меня были проблемы с новыми намерениями и уведомлениями. Предыдущее решение не работает с уведомлениями и намерениями ...

1 голос
/ 31 июля 2018

Просто добавьте это в метод onCreate вашей активности запуска следующим образом:

      @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    if (!isTaskRoot()) {
        finish();
        return;
    }
    // other function
    }
0 голосов
/ 09 февраля 2017

Аналогичное решение для Xamarin.Android:

if (!IsTaskRoot)
            {
                string action = this.Intent.Action;
                if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain)
                {
                    Finish();
                    return;
                }
            }
...