在Android上创建两次活动

问题描述:

首先,我是Android开发新手,请耐心等待。在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都不存在。

我已经添加了一些调试日志行来跟踪事件的顺序。当我得到的不良行为,这是输出I得到:

  • GetImageActivity - 的onCreate
  • GetImageActivity - 呼叫相机活动

相机打开,一旦我拍摄的照片,它说:

  • GetImageActivity - 的onCreate(再次)
  • GetImageActivity - 呼叫相机活动
  • GetImageActivity - onActivityResult

相机第二次打开。用户拍摄另一张照片和:

  • GetImageActivity - onActivityResult
  • GUIActivity - onActivityResult

所以我的问题是,有什么能引起GetImageActivity被调用两次?

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

onCreate的第二个呼叫用于处理结果。

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

您可以验证这是否是你的问题通过登录调用onCreate & onDestroy

在活动被破坏的情况下,当活动结果需要处理时,Android会重新创建Activity,并将savedInstanceState传递给onCreate。所以,补救措施是检查您的GetImageActivity.onCreate中的savedInstanceState的值。如果不是null,则不要致电startActivity,因为您的Activity正在重新创建,致电onActivityResult

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

当您拨打startActivityForResult时,它告诉Android,您希望将结果传送到拨打该电话的Activity。这解释了您在登录GetImageActivity - onCreate (again)时看到的内容。

既然你叫你第一活动startActivityForResult,就是GUIActivity比你应该调用GetImageActivitysetResult正确传回的结果。

所以在GetImageActivity.onActivityResult()您电话之前finish()你应该叫setResult,这样当您返回到GUIActivity它可以处理预期的结果。

+0

我将修改代码,使其更清晰。它在'GetImageActivity'类中说//处理结果,我实际上调用'setResult()'。需要注意的是,即使在第一次调用onActivityResult()方法之前,该活动也会再次创建。 –

在AndroidManifest.xml添加到您的活动定义:

android:launchMode = "singleInstance" 

在AndroidManifest.xml您的活动定义这个地址:

android:launchMode = "singleTask"