1

在用户撤销设置中的权限并从后台恢复后,我的应用程序崩溃并出现 IllegalStateException:在 onSaveInstanceState 之后无法执行此操作。我看到操作系统试图从后台重新创建片段堆栈(重新启动应用程序不会导致崩溃)。我尝试使用标志捕获撤销操作,如果为真,则向用户显示一个对话框,通知重新启动应用程序。但在显示对话框后,操作系统仍会继续尝试重新创建堆栈,从而崩溃。

如果标志为真,我也尝试弹出所有片段,但没有运气。

谷歌开发人员表示,撤销权限会导致应用程序失去功能,但崩溃不仅仅是失去功能。显示对话框后如何暂停应用程序?

4

1 回答 1

2

撤销权限正在杀死您未销毁的活动,当您返回时,它们可能会被恢复savedInstanceState,而不是您正在测试的通常方式。

您发布的异常意味着您的代码在之后执行commit()(或popBackStack())(或,通常在之后调用),或者由于某些异步操作,您在最小化时忘记取消。FragmentTransactiononSaveInstanceState()onPause()onStop()Activity

为了安全起见,我通常会跟踪我是否可以提交FragmentTransactions,就像这样

public abstract class BaseActivity extends AppCompatActivity {

    private boolean mFragmentTransactionsAllowed;

    @Override
    protected void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mFragmentTransactionsAllowed = true;
    }

    @Override
    protected void onStart() {
        super.onStart();
        mFragmentTransactionsAllowed = true;
    }

    @Override
    protected void onResume() {
        super.onResume();
        mFragmentTransactionsAllowed = true;
    }

    @Override
    protected void onSaveInstanceState(final Bundle outState) {
        super.onSaveInstanceState(outState);
        mFragmentTransactionsAllowed = false;
    }

    protected final boolean areFragmentTransactionsAllowed() {
        return mFragmentTransactionsAllowed;
    }
}

在提交之前我会检查

if (areFragmentTransactionsAllowed()) {
    ft.commit();
}
于 2017-05-07T15:12:44.027 回答