在Android上创build两次活动

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

我将从UI开始,我有一个button,一旦你点击它,开始一个结果的活动。

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: //... } } } 

这是用户点击button时预期会发生的事情:

  • 相机活动应该开始。
  • 一旦用户拍摄照片,它应该将其URI发送回GUI类。

有时(通常是50%的几率)在预期的情况下工作,但其他时候会发生什么情况:

  • 相机活动开始。
  • 用户拍照。
  • 相机活动重新开始。
  • 用户可以拍摄另一张照片或返回。
  • 无论是哪种情况,返回到GUI类的URI都不存在。

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

  • GetImageActivity – onCreate
  • GetImageActivity – 调用相机活动

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

  • GetImageActivity – onCreate(再次)
  • GetImageActivity – 调用相机活动
  • GetImageActivity – onActivityResult

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

  • GetImageActivity – onActivityResult
  • GUIActivity – onActivityResult

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

Related of "在Android上创build两次活动"

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

第二次调用onCreate是为了处理结果。

Android可能会select销毁正在等待onActivityResult调用的Activity ; 尤其是当可用内存不足时。 有些设备对于销毁任务堆栈上的活动看起来更积极。 我可以可靠地在三星设备上重新创build一个名为“严格模式”的debugging模式的问题。

您可以通过将调用logging到onCreateonDestroy来validation这是否是您的问题。

在活动被破坏的情况下,当活动结果需要处理时,Android将重新创buildActivity ,并将savedInstanceState传递给onCreate 。 所以,补救措施是检查savedInstanceStatesavedInstanceState的值。 如果它不为null则不要对startActivity进行任何调用,因为正在重新创buildActivity以调用onActivityResult

可选地,如果你需要保留任何状态,那么重写onSaveInstanceState(Bundle outState)并把你需要的数据放到outState

将其添加到AndroidManifest.xml中的Activity定义中:

 android:launchMode = "singleInstance" 

当你调用startActivityForResult它告诉Android你想把结果传递给正在进行调用的Activity 。 这解释了您在GetImageActivity - onCreate (again)login时看到的内容。

由于您在第一个活动中调用startActivityForResult ,也就是说,您应该在GUIActivity中调用setResult来正确传回结果。

所以在GetImageActivity.onActivityResult()调用finish()之前,您应该调用setResult以便在返回到GUIActivity时可以处理预期的结果。

将其添加到AndroidManifest.xml中的Activity定义中:

 android:launchMode = "singleTask"