非法状态异常:一旦设置活动类型就不能更改。

21
我发现多个设备上都抛出了一个异常,但我除了谷歌的测试类中使用该异常的字符串外,没有找到任何内容。您有什么提示,为什么会发生这种情况吗?
Fatal Exception: java.lang.IllegalStateException: Can't change activity type once set: { mBounds=Rect(0, 0 - 1080, 2076) mAppBounds=Rect(0, 0 - 1080, 2076) mWindowingMode=fullscreen mActivityType=home} activityType=standard
       at android.os.Parcel.createException(Parcel.java:1974)
       at android.os.Parcel.readException(Parcel.java:1934)
       at android.os.Parcel.readException(Parcel.java:1884)
       at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:3604)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1669)
       at android.app.Activity.startActivityForResult(Activity.java:4688)
       at android.support.v4.app.FragmentActivity.startActivityForResult(SourceFile:767)
       at android.app.Activity.startActivityForResult(Activity.java:4646)
       at android.support.v4.app.FragmentActivity.startActivityForResult(SourceFile:754)
       at android.app.Activity.startActivity(Activity.java:5007)
       at android.app.Activity.startActivity(Activity.java:4975)
       at com.myapp.MyActivity.showAndroidHomeScreen(SourceFile:208)
       at com.myapp.MyActivity.onBackPressed(SourceFile:548)
       at android.app.Activity.onKeyUp(Activity.java:3168)
       at android.view.KeyEvent.dispatch(KeyEvent.java:3374)
       at android.app.Activity.dispatchKeyEvent(Activity.java:3451)
       at android.support.v4.app.SupportActivity.superDispatchKeyEvent(SourceFile:108)
       at android.support.v4.view.KeyEventDispatcher.dispatchKeyEvent(SourceFile:84)
       at android.support.v4.app.SupportActivity.dispatchKeyEvent(SourceFile:126)
       at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(SourceFile:535)
       at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(SourceFile:59)
       at android.support.v7.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(SourceFile:2533)
       at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:564)
       at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6012)
       at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5867)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
       at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5498)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
       at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5555)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
       at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5531)
       at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:5700)
       at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3407)
       at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2854)
       at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2845)
       at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3384)
       at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:326)
       at android.os.Looper.loop(Looper.java:181)
       at android.app.ActivityThread.main(ActivityThread.java:6981)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

Caused by android.os.RemoteException: Remote stack trace:
    at android.app.WindowConfiguration.setActivityType(WindowConfiguration.java:366)
    at android.app.WindowConfiguration.setTo(WindowConfiguration.java:390)
    at android.content.res.Configuration.setTo(Configuration.java:1136)
    at com.android.server.wm.ConfigurationContainer.onConfigurationChanged(ConfigurationContainer.java:124)
    at com.android.server.wm.ConfigurationContainer.onParentChanged(ConfigurationContainer.java:523)

导致问题的代码如下:

 private void showAndroidHomeScreen() {
        final Intent mainScreen = new Intent(Intent.ACTION_MAIN);
        mainScreen.addCategory(Intent.CATEGORY_HOME);
        mainScreen.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        PackageManager pm = getPackageManager();
        if (pm.queryIntentActivities(mainScreen, 0).size() > 0) {
            startActivity(mainScreen);
        }
    }

1
你解决了吗?我在想要显示启动器选择器时也遇到了这个问题。 - Truong Hieu
1
不,它仍然发生。 - David
你找到解决方案了吗? - Deepak Rajput
@David,您在更新启动模式singleTask的launcher activity之后是否仍然遇到问题?我的问题已经解决了,我在Nokia2.3/10上也能再现该问题。 - Imtiyaz Khalani
2个回答

2
这是启动器问题。请尝试使用不同的启动器进行检查。
根本原因是,启动器正在为其启动器活动使用launchMode="singleInstance"。如果这是您的启动器,则使用android:launchMode="singleTask"。
同时,尝试删除mainScreen.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)。
希望这可以帮到您。
更新:对于需要设置为默认的活动,将android:launchMode="singleTask"进行更新,它将修复您的问题。无需使用FLAG_ACTIVITY_NO_HISTORY。

你确定吗?你是怎么发现的?不,这不是我的启动器,我只是确保退出自己的应用程序并启动启动器。 - David
是的,在Android 10设备上才会遇到这个问题。对吗? - Imtiyaz Khalani
我现在不确定,需要在Crashlytics上搜索问题,我认为它不仅限于10。 - David
这对我不起作用,因为我没有这个标志,而我设置了setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);。 - Deepak Rajput
@DeepakRajput 你能否请再次检查你的活动的launchMode。 - Imtiyaz Khalani
@David,你是在使用自定义启动器还是系统启动器时出现这种情况? - Imtiyaz Khalani

0

启动器活动的默认启动模式是singleTask,您可以删除Intent.FLAG_ACTIVITY_NO_HISTORY再尝试,但无法在意图中覆盖启动模式。


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