有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在安卓上创建两次java活动

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

我将从UI开始,我有一个按钮,一旦你点击它,就会启动一个活动以获得结果

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类是另外两个活动的包装器,一个用于从相机捕获图像,另一个用于从画廊获取图像。它返回选定图像的URL和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("安卓.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
  • GUI活动-onActivityResult

所以我的问题是。。。什么会导致GetImageActivity被调用两次


共 (4) 个答案

  1. # 1 楼答案

    将其添加到AndroidManifest中的活动定义中。xml:

    android:launchMode = "singleTask"
    
  2. # 2 楼答案

    将其添加到AndroidManifest中的活动定义中。xml:

    android:launchMode = "singleInstance"
    
  3. # 3 楼答案

    问题在于Activity生命周期的处理不当

    onCreate的第二个调用用于处理结果

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

    您可以通过记录对onCreate&;的调用来验证这是否是您的问题onDestroy

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

    或者,如果需要保留任何状态,则重写onSaveInstanceState(Bundle outState),并将所需数据放入outState

  4. # 4 楼答案

    当你调用startActivityForResult时,它告诉安卓,你希望将结果传递给正在进行调用的Activity。这就解释了你登录GetImageActivity - onCreate (again)时看到的内容

    由于您在第一个活动中调用了startActivityForResult,也就是说,GUIActivity,因此您应该在GetImageActivity中调用setResult,以便正确地传回结果

    所以在GetImageActivity.onActivityResult()中,在调用finish()之前,您应该调用setResult,这样当您返回GUIActivity时,它可以处理预期的结果