活动生命周期的奇怪行为 - 在onResume()之后也onPause()调用...为什么?

时间:2013-05-12 13:23:23

标签: android android-lifecycle

我有一个带有edittexts的表单和一个用于调用相机的按钮(返回放入imageview的位图)...从纵向模式我输入所有的edittext字段然后单击前进的相机按钮我到了相机 - 在相机中我拍了一张照片后我回到了活动1(保持纵向 - 所有的文字字段都在onRestoreInstanceState()恢复) - 活动1的最后一个回调方法是{ {1}}(没关系) - 但是当我从这个肖像模式改为横向模式时,问题就出现了 - 回调方法正在跟随

dsfa

因此,最后一次回调方向更改为onResume()。我不懂为什么?问题是onSaveInstanceState在onPause之前调用 - 所以当我回到纵向模式时,所有内容都将为空(editexts,imageview ..) - 这种奇怪的行为会在每次方向更改时继续(最后调用onPause())。

我确信这个问题必须与拍摄图像(startInentforResult ....)有关,因为所有(editext字段)在拍摄图像之前在方向更改上工作正常...有时我也可以拍摄图像它工作正常,但在大多数情况下不是......

所以我的问题是,什么是“将”我的活动“驱动”到onPause()方法而不是onPause()

谢谢,如果有人知道解决方案,我真的很感激,因为我已经在几天内努力解决这个问题了,无法找到解决方案。

该项目有很多类,但这是活动代码(需要注意的是,只有当我从相机应用程序中获取图像时才会出现问题,之后活动生命周期变得疯狂 - 此活动也会从主要活动调用使用'startIntentforResult()'。我不使用'android:configChanges =“orientation | keyboardHidden”'来停止recreatioin:

onResume()

2 个答案:

答案 0 :(得分:0)

调用recreate()时遇到同样的问题,当活动更新后,它会在onResume之后获得onPause。在模拟器上测试,Marshallow及其下方存在bug。

这是我的修复

private static boolean isRecreate = false;

private void reCreateActivity() {
    isRecreate = true;
    recreate();
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    if(isRecreate) {
        isRecreate = false;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                onResume();
            }
        });
    }
}

我不知道这是否正确,但是有效。

修改

避免此问题的最佳解决方案,使用0 delayMillis

调用postDelayed中的重新创建
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        recreate();
    }
}, 0);

答案 1 :(得分:0)

这是很正常的,奇怪的代码会产生奇怪的行为...

替换此行:

((MyApplicationClass) getApplication()).detach(this);

有这行:

super.onSaveInstanceState(outState);