在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可能会选择销毁正在等待拨打onActivityResult
的Activity
;尤其是当可用内存不足时。有些设备对于销毁任务堆栈上的活动显得更积极。我可以可靠地在三星设备上重新创建问题,将其设置为称为“严格模式”的调试模式。
您可以验证这是否是你的问题通过登录调用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
比你应该调用GetImageActivity
setResult
正确传回的结果。
所以在GetImageActivity.onActivityResult()
您电话之前finish()
你应该叫setResult
,这样当您返回到GUIActivity
它可以处理预期的结果。
在AndroidManifest.xml添加到您的活动定义:
android:launchMode = "singleInstance"
在AndroidManifest.xml您的活动定义这个地址:
android:launchMode = "singleTask"
我将修改代码,使其更清晰。它在'GetImageActivity'类中说//处理结果,我实际上调用'setResult()'。需要注意的是,即使在第一次调用onActivityResult()方法之前,该活动也会再次创建。 –