Очистка задачи из другого стека - PullRequest
1 голос
/ 07 июня 2019

У меня активность 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, но он мне нужен, потому что мое приложение может быть запущено различными способами ...

Другой момент: исключение выдается при обновлении приложения из АБР. Когда приложение запускается автоматически при запуске устройства, исключение не выдается. (Мое приложение - средство запуска по умолчанию, поэтому оно запускается автоматически). -> Это, вероятно, можно объяснить различной последовательностью в начале двух действий.

1 Ответ

0 голосов
/ 07 июня 2019

надеюсь понять вашу проблему Вы можете использовать sheardPreferences и присвоить ему значения, например, ноль и единица. Если значение ноль является корневым, то splashScreen и One находится в процессе Деятельность2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...