首先,我是Android开发的新手,所以请耐心等待。

我将从用户界面开始,我有一个按钮,一旦您点击它,就会启动一个活动以获得结果。

public class GUIActivity extends Activity

    @Override
    public void onClick(....){
        Intent intent = new Intent(getApplicationContext(), GetImageActivity.class);
        intent.putExtra("action", FROM_CAMERA);
        startActivityForResult(intent, GET_IMAGE);
    }

    @Override
    onActivityResult(int requestCode, int resultCode, Intent data){
        Log(TAG, "onActivityResult");
        //handle result
    }

}
GetImageActivity类是其他两个活动的包装,一个活动是从相机捕获图像,另一个活动是从图库中获取图像。它返回所选图像的Uri对象。
public class GetImageActivity extends Activity{
    private Uri mediaUri;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        int action =  extras.getInt("action");

        Log.d(TAG, "onCreate");

        switch(action){
            case FROM_CAMERA:
                mediaUri = Uri.fromFile(new File(....));
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaUri);

                Log.d(TAG, "Calling camera activity"
                startActivityForResult(intent, action);
                break;
            case FROM GALLERY:
                //...
        }
    }

    @Override
    onActivityResult(int requestCode, int resultCode, Intent data){
        Log.d(TAG, "onActivityResult");

        switch(requestCode){
            case FROM_CAMERA:
                if(resultCode == Activity.RESULT_OK){
                    Intent data = new Intent();
                    data.putExtra("uri", mediaUri);
                    setResult(Activity.RESULT_OK, data);
                    finish();
                }else{
                    Log.e(TAG, "Camera activity failed!");
                    setResult(Activity.RESULT_CANCELED);
                    finish();
                }
                break;

            case FROM_GALLERY:
                //...

        }
    }
}

当用户单击按钮时,将发生以下情况:
  • 相机活动应开始。
  • 用户拍摄照片后,应将其URI发送回GUI类。

  • 有时(通常有50%的机会)它会按预期工作,但有时是这样:
  • 相机活动开始。
  • 用户拍照。
  • 相机活动再次开始。
  • 用户可以拍摄另一张照片或返回。
  • 不管哪种情况,返回到GUI类的URI不存在。

  • 我添加了一些调试日志行以遵循事件的顺序。当我得到不良行为时,这是我得到的输出:
  • GetImageActivity-onCreate
  • GetImageActivity-调用相机活动

  • 相机打开,一旦我拍照,它就会说:
  • GetImageActivity-onCreate(再次)
  • GetImageActivity-调用相机活动
  • GetImageActivity-onActivityResult

  • 相机第二次打开。用户拍摄另一张照片并:
  • GetImageActivity-onActivityResult
  • GUIActivity-onActivityResult

  • 所以我的问题是...什么可能导致GetImageActivity被调用两次?

    最佳答案

    问题是对Activity生命周期的处理不当。

    onCreate的第二次调用用于处理结果。

    Android可能会选择销毁正在等待Activity调用的onActivityResult;尤其是当可用内存不足时。某些设备在销毁任务堆栈上的“活动”时显得更具攻击性。我可以在设置为调试模式“严格模式”的三星设备上可靠地重新创建该问题。

    您可以通过记录对onCreateonDestroy的调用来验证这是否是您的问题。

    在活动被破坏的情况下,当需要处理活动结果时,Android将重新创建Activity,并将savedInstanceState传递给onCreate。因此,解决方法是检查savedInstanceStateGetImageActivity.onCreate的值。如果不是null,则不要对startActivity进行任何调用,因为正在重新创建您的Activity来调用onActivityResult

    (可选)如果需要保留任何状态,则覆盖onSaveInstanceState(Bundle outState)并将所需的数据放入outState

    07-24 09:15