首先,我是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:
//...
}
}
}
当用户单击按钮时,将发生以下情况:
有时(通常有50%的机会)它会按预期工作,但有时是这样:
我添加了一些调试日志行以遵循事件的顺序。当我得到不良行为时,这是我得到的输出:
相机打开,一旦我拍照,它就会说:
相机第二次打开。用户拍摄另一张照片并:
所以我的问题是...什么可能导致
GetImageActivity
被调用两次? 最佳答案
问题是对Activity
生命周期的处理不当。
对onCreate
的第二次调用用于处理结果。
Android可能会选择销毁正在等待Activity
调用的onActivityResult
;尤其是当可用内存不足时。某些设备在销毁任务堆栈上的“活动”时显得更具攻击性。我可以在设置为调试模式“严格模式”的三星设备上可靠地重新创建该问题。
您可以通过记录对onCreate
和onDestroy
的调用来验证这是否是您的问题。
在活动被破坏的情况下,当需要处理活动结果时,Android将重新创建Activity
,并将savedInstanceState
传递给onCreate
。因此,解决方法是检查savedInstanceState
中GetImageActivity.onCreate
的值。如果不是null
,则不要对startActivity
进行任何调用,因为正在重新创建您的Activity
来调用onActivityResult
。
(可选)如果需要保留任何状态,则覆盖onSaveInstanceState(Bundle outState)
并将所需的数据放入outState
。