非法参数异常:setTaskFromReuseOrCreateNewTask

3

当我尝试启动一个Activity时,出现了以下崩溃:

2019-10-24 15:12:29.887 4245-4296/fr.zapotec.eliodroid.tv E/AndroidRuntime: FATAL EXCEPTION: Thread-6
Process: fr.zapotec.eliodroid.tv, PID: 4245
java.lang.IllegalArgumentException: setTaskFromReuseOrCreateNewTask: task=TaskRecord{6e69142 #1643 A=fr.zapotec.eliodroid.tv U=0 StackId=1 sz=3} is in a different stack (1) than the parent of r=ActivityRecord{8062424 u0 fr.zapotec.eliodroid.tv/fr.zapotec.eliodroid.SplashActivity t1644} (0)
    at android.os.Parcel.readException(Parcel.java:1955)
    at android.os.Parcel.readException(Parcel.java:1897)
    at android.app.IActivityManager$Stub$Proxy.startActivities(IActivityManager.java:6812)
    at android.app.Instrumentation.execStartActivitiesAsUser(Instrumentation.java:1677)
    at android.app.Instrumentation.execStartActivities(Instrumentation.java:1632)
    at android.app.ContextImpl.startActivities(ContextImpl.java:910)
    at android.app.ContextImpl.startActivities(ContextImpl.java:884)
    at android.content.ContextWrapper.startActivities(ContextWrapper.java:399)
    at fr.zapotec.eliodroid.utils.LaunchActivityUtils.launchTVLastProgram(LaunchActivityUtils.java:22)
    at fr.zapotec.eliodroid.standby.StandbyManager.launchAction(StandbyManager.java:253)
    at fr.zapotec.eliodroid.standby.StandbyManager.onEventReceived(StandbyManager.java:141)
    at fr.zapotec.eliodroid.handset.HandsetEventDispatcherImpl.handleKeyPress(HandsetEventDispatcherImpl.java:229)
    at fr.zapotec.eliodroid.handset.HandsetEventDispatcherImpl.handleKeyPress(HandsetEventDispatcherImpl.java:204)
    at fr.zapotec.eliodroid.handset.HandsetEventDispatcherImpl.onMessageReceived(HandsetEventDispatcherImpl.java:165)
    at fr.zapotec.handsetbluetooth.HandsetManagerImpl.dispatchMessage(HandsetManagerImpl.java:49)
    at fr.zapotec.handsetbluetooth.MessageManager.onNewMessageReceived(MessageManager.java:119)
    at fr.zapotec.handsetbluetooth.HandsetThread.listenAndWrite(HandsetThread.java:126)
    at fr.zapotec.handsetbluetooth.HandsetThread.run(HandsetThread.java:56)

这是清单文件:

        <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:noHistory="true"
        android:name=".StandbyActivity"/>
    <activity
        android:launchMode="singleTask"
        android:name=".main.SimpleMainActivity"/>
    <activity
        android:launchMode="singleTask"
        android:name=".main.InstallActivity"/>

我可以帮您翻译成如下内容:

我希望“SimpleMainActivity”这个活动只有一个实例(所以使用了“singleTask”)。这个活动会因为蓝牙事件(由蓝牙设备触发)或者在特定情况下按照给定时间启动。

启动这个活动的方法是:

startActivity(new Intent(context, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK));

我尝试同时从两个不同的来源启动Activity时,出现了崩溃。

有人知道如何解决这个问题,而不需要从我的Activity中删除“singleTask”吗?

需要注意的是,我的应用程序是“默认启动器”,因此如果系统需要显示启动器,则可能会启动“SplashActivity”。 SplashActivity仅显示一个闪屏,并启动第一个活动(SimpleMainActivity.class)。


通常使用Activity来显示启动画面并不是正确的方法。请参见https://android.jlelse.eu/right-way-to-create-splash-screen-on-android-e7f1709ba154。 - davkutalek
1个回答

0

可能会起作用的方法是使用launchModesingleTop,并设置标志FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP文档确实建议对通过通知启动的活动使用此方法。


1
如果您使用清除顶部和新任务标志,那么它将有效地保证它是单例。试一试吧。 - davkutalek
不是我需要的解决方案。由于在我的清单中声明了NFC事件,因此系统也可以启动给定的Activity。我重申,我的Activity需要是“singleTask”。谢谢。 - zapotec
你能说一下为什么这不是你需要的解决方案吗?不要假设你知道解决方案是什么,而是要了解实际行为是什么导致它无法正常工作?我已经成功地使用了这个方法来确保Activity的单例实例。 - davkutalek
我向你解释过。我需要我的Activity是singleTask模式。你是否确认通过这种行为,由Manifest声明触发的NFC事件仍在管理单例实例?如果是这样,请告诉Android团队“singleTask”启动模式是无用的。我需要一种解决方案,不改变我的Activity的启动模式。当我说“有人知道如何在不删除我的Activity中的'singleTask'的情况下解决这个问题吗?”时,我很明确。 - zapotec
1
由于NFC案例比较奇怪,您可能需要使用taskAffinityallowTaskReparenting或者使用广播接收器或其他活动捕获NFC意图,然后将自己的意图发送到单例活动。 - davkutalek
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接