У меня активность 1 (SplashActivity) запущена на переднем плане.
Это всплесковое действие запускает другое Activity2 в своем обратном вызове onStart ().
Из elswhere (синглтон, работающий в контексте приложения) я хочу запустить Activity3 и очистить задачу, чтобы сделать ее новым корнем. Этот вызов выполняется через несколько миллисекунд после другой функции startActivity в onStart (), и он завершается с ошибкой:
java.lang.IllegalArgumentException: setTaskFromReuseOrCreateNewTask: task=TaskRecord{df9fb2e #10 A=com.example.myapp.myflavor U=0 StackId=1 sz=0} is in a different stack (1) than the parent of r=ActivityRecord{3b14930 u0 com.example.myapp.myflavor/com.example.myapp.SplashActivity t11} (0)
at com.android.server.am.ActivityRecord.reparent(ActivityRecord.java:971)
at com.android.server.am.ActivityStarter.addOrReparentStartingActivity(ActivityStarter.java:1992)
at com.android.server.am.ActivityStarter.setTaskFromReuseOrCreateNewTask(ActivityStarter.java:1808)
at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1187)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1002)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:567)
at com.android.server.am.ActivityStarter.startActivityLocked(ActivityStarter.java:272)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:824)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4497)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4464)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:121)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2935)
at android.os.Binder.execTransact(Binder.java:674)
Действия определяются в AndroidManifest.xml следующим образом:
<activity
android:launchMode="singleTask"
android:name=".SplashActivity"
android:noHistory="true"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<activity
android:launchMode="singleTask"
android:name=".Activity2"/>
<activity
android:launchMode="singleTask"
android:name=".Activity3"
android:noHistory="true"/>
Activity2 и Activity3 запускаются с флагом:
Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK
Когда вызывается первая startActivity, единственная задача имеет идентификатор 14 и содержит только одну операцию: SplashActivity.
Когда вызывается вторая функция startActivity, единственная задача имеет идентификатор -1 и содержит 0 действий.
Итак, каково решение, обеспечивающее устойчивость startActivity в ситуации, когда выполняется другая startActivity?
Есть идеи?
Из того, что я понимаю, я бы избежал этой ошибки, удалив режим запуска singleTask, но он мне нужен, потому что мое приложение может быть запущено различными способами ...
Другой момент: исключение выдается при обновлении приложения из АБР. Когда приложение запускается автоматически при запуске устройства, исключение не выдается. (Мое приложение - средство запуска по умолчанию, поэтому оно запускается автоматически). -> Это, вероятно, можно объяснить различной последовательностью в начале двух действий.