在安卓上创建两次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
被调用两次
# 1 楼答案
将其添加到AndroidManifest中的活动定义中。xml:
# 2 楼答案
将其添加到AndroidManifest中的活动定义中。xml:
# 3 楼答案
问题在于
Activity
生命周期的处理不当对
onCreate
的第二个调用用于处理结果Android可能会选择销毁一个
Activity
正在等待对onActivityResult
的调用;尤其是当可用内存不足时。有些设备在销毁任务堆栈上的活动时显得更具攻击性。我可以在三星设备上可靠地重新创建问题,并将其设置为一种称为“严格模式”的调试模式您可以通过记录对
onCreate
&;的调用来验证这是否是您的问题onDestroy
在销毁活动的情况下,当需要处理活动结果时,Android将重新创建
Activity
,将savedInstanceState
传递给onCreate
。因此,解决方法是检查savedInstanceState
中GetImageActivity.onCreate
的值。如果它不是null
,那么不要对startActivity
进行任何调用,因为正在重新创建Activity
以调用onActivityResult
或者,如果需要保留任何状态,则重写
onSaveInstanceState(Bundle outState)
,并将所需数据放入outState
# 4 楼答案
当你调用
startActivityForResult
时,它告诉安卓,你希望将结果传递给正在进行调用的Activity
。这就解释了你登录GetImageActivity - onCreate (again)
时看到的内容由于您在第一个活动中调用了
startActivityForResult
,也就是说,GUIActivity
,因此您应该在GetImageActivity
中调用setResult
,以便正确地传回结果所以在
GetImageActivity.onActivityResult()
中,在调用finish()
之前,您应该调用setResult
,这样当您返回GUIActivity
时,它可以处理预期的结果