Метод recreate() автоматически (воссоздает и) приостанавливает действие на уровне API эмулятора 1624.

Предположим, у вас есть два действия: A (лаунчер) и B. У действия A есть кнопка, при нажатии на которую для результата запускается действие B. Когда пользователь нажимает клавишу "Назад", в методе onActivityResult() действия A поместите вызов метода recreate(). Что происходит, так это то, что действие A воссоздается, возобновляется и автоматически приостанавливается (то есть метод onPause() вызывается после onResume(), но действие, конечно, полностью видно) . Это происходит на эмуляторе, уровень API 16,17,18,19,21,22,23. На реальном смартфоне с API 23 такого не происходит. Вы можете поставить флаг внутри onActivityResult() и вызвать метод recreate() из onResume() и получить тот же результат. Это ошибка эмуляторов Android или я что-то упустил? Часть файла градиента:

  compileSdkVersion 27
    defaultConfig {
        applicationId "com.test.test2"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

Обновлять

Я вижу, что кто-то еще обнаружил такое же странное поведение: вопрос о переполнении стека. Кажется, я добавил еще немного информации.


person berlusca    schedule 08.08.2018    source источник
comment
Я бы исследовал ваш экземпляр управления в манифесте. У вас может быть разрешен один экземпляр, в котором старый жив, пока вы не перезапустите его новую версию, и в этом случае он запускает новый, заканчивая старый. Есть несколько странных действий, которые могут произойти в зависимости от того, как вы запускаете намерение, и от вашей конфигурации манифеста действия. Нельзя сказать, что это не ошибка, но часто эмуляторы Google и телефоны Google более строги в отношении этих вещей, тогда как другие OEM-производители могут просто справиться с этим.   -  person Sam    schedule 08.08.2018
comment
@Sam Оба действия являются singleTop, у намерения нет специальных флагов. Это проект, начатый с нуля, просто для проверки этого поведения.   -  person berlusca    schedule 08.08.2018
comment
Не могли бы вы подробнее рассказать об этом утверждении, поместив вызов метода recreate(). Что происходит, так это то, что действие A воссоздается, я не уверен, что вы подразумеваете под вызовом метода recreate(). Вы говорите, что onCreate вызывается автоматически? или вы подразумеваете что-то еще, как вы называете свою собственную процедуру воссоздания?   -  person Sam    schedule 09.08.2018
comment
@Sam В A.onActivityResult() (когда мы возвращаемся из B в A) вызовите метод recreate(). Или установите какой-либо флаг в значение true и вызовите метод recreate() из A.onResume(). Метод recreate() — это метод класса Activity (SDK, а не мой). Что происходит, так это то, что активность A воссоздается и возобновляется, и это, очевидно, нормально, но она также автоматически ставится в состояние паузы (автоматически вызывается метод onPause()).   -  person berlusca    schedule 09.08.2018