Trước hết, tôi mới phát triển Android nên hãy kiên nhẫn với tôi.Hoạt động được tạo hai lần trên android
Tôi sẽ bắt đầu từ giao diện người dùng, tôi có một nút khi bạn nhấn vào nó, bắt đầu một hoạt động để có kết quả.
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
}
}
Lớp GetImageActivity
là một wrapper cho hai hoạt động khác, một để chụp ảnh từ camera và khác để có được nó từ thư viện. Nó trả về và đối tượng Uri của ảnh đã chọn.
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:
//...
}
}
}
Đây là những gì được kỳ vọng sẽ xảy ra khi người dùng nhấp chuột vào nút:
- Các hoạt động máy ảnh nên bắt đầu.
- Khi người dùng chụp ảnh, nó sẽ gửi lại URI của nó tới lớp GUI.
Đôi khi (nó thường là một cơ hội 50%) nó hoạt động tại mong đợi, nhưng đôi khi đây là những gì sẽ xảy ra:
- hoạt động Chiếc máy ảnh này bắt đầu.
- Người dùng chụp ảnh.
- Hoạt động của máy ảnh bắt đầu từ AGAIN.
- Người dùng có thể chụp ảnh khác hoặc quay lại.
- Cả hai trường hợp, URI quay trở lại lớp GUI không tồn tại.
Tôi đã thêm một vài dòng đăng nhập gỡ lỗi để theo dõi chuỗi sự kiện. Khi tôi nhận được hành vi xấu này là kết quả tôi nhận được:
- GetImageActivity - onCreate
- GetImageActivity - Gọi Máy ảnh Hoạt động
Chiếc máy ảnh này sẽ mở ra, và một khi tôi đã chụp ảnh nó nói :
- GetImageActivity - onCreate (một lần nữa)
- GetImageActivity - Gọi Máy ảnh Hoạt động
- GetImageActivity - onActivityResult
Máy ảnh sẽ mở lần thứ hai. Người dùng phải mất một hình ảnh và:
- GetImageActivity - onActivityResult
- GUIActivity - onActivityResult
Vì vậy, câu hỏi của tôi là ... những gì có thể gây ra GetImageActivity
được gọi là hai lần?
tôi sẽ chỉnh sửa mã để làm cho nó rõ ràng hơn . Khi nó nói '// xử lý kết quả' trên lớp' GetImageActivity', tôi thực sự gọi 'setResult()'. Điều cần lưu ý là hoạt động được tạo lại ngay cả trước khi phương thức 'onActivityResult()' được gọi lần đầu tiên. –