Странное поведение при выполнении startActivityForResult однократного действия

#android #kotlin

#Android #kotlin

Вопрос:

Я создал три действия в приложении для Android: MainActivity , SecondActivity , ThirdActivity и регистрирую onCreate@taskId событие этих действий.

Режим запуска SecondActivity установлен на singleInstance .

Затем я вставил две кнопки MainActivity .

button1 startActivity(SecondActivity) .

button2 startActivityForResult(SecondActivity) .

button3 startActivity(ThirdActivity) .

После нажатия кнопки button1 -> нажмите кнопку button3 я получил следующий журнал, который соответствует моим ожиданиям:

 MainActivity onCreat@xxx0
SecondActivity onCreate@xxx1 // second activity is expected in a new task
ThirActivity onCreate@xxx0 // third
 

Но нажмите button2 -> нажмите button3:

 MainActivity onCreat@xxx0
SecondActivity onCreate@xxx0 // it seems that startActivityForResult will make singleInstance activity not work
ThirdActivity onCreate@xxx1 // Here is the weird thing, the ThirdActivity is created on a new task!
 

Кто-нибудь может это объяснить?

Вот тест репозитория singleInstanceTest для воспроизведения.

Комментарии:

1. Intent.FLAG_ACTIVITY_NEW_TASK должно сработать.

2. @Raghunandan Я добавляю этот флаг при запуске SecondActivity, ничего не изменилось.

3. Оно должно работать с флагом намерения, второе действие запускается в новой задаче

4. Кажется singleInstance , это не работает startActivityForResult . Я думаю, если вы хотите сохранить текущее поведение, то из MainActivity просто используйте startActivity(SecondActivity). Затем используйте широковещательную передачу или EventBus для возврата результата в MainActivity.

Ответ №1:

В документах говорилось

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

Я использую определение singleTask режима запуска, чтобы объяснить это поведение, потому что оно аналогично

  1. Когда вы нажимаете на Button 1 него SecondActivity , и когда вы возвращаетесь (я предполагаю, что вы нажимаете назад или вызываете finish ), экземпляр SecondActivity выскакивает BackStack
  2. Когда вы нажимаете на Button 2 экземпляр SecondActivity not exits, so System создаст новый экземпляр для SecondActivity

Чтобы понять это, вам следует попробовать follow MainActivity -> startActivityForResult(SecondActivity) -> Create button в SecondActivity start ThirdActivity -> в ThirdActivity create button и вызвать startActivityForResult(SecondActivity) . Запишите это, чтобы понять.