在非活动类中等待活动完成

4

我的应用程序中有一个方法,它启动一个新的Activity,该Activity启动相机应用程序。相机应用程序返回结果(拍摄或未拍摄的图片),我将此结果存储在Intent-Bundle中。

在原始方法中,我想读取此Bundle,但无法读取,因为Activity尚未完成。

在我的方法中如何等待Activity完成后再继续执行下一步操作?

方法

@Override    
public boolean startChallenge(Context context) {
        Intent cam = new Intent(context, CameraIntent.class);
        cam.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(cam);

        Boolean done = cam.getExtras().get("done"); // << this fails obviously
}

活动

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);         
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(i, CAPTURE_IMAGE_CAPTURE_CODE);
 }

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    intent = getIntent();
    if (requestCode == CAPTURE_IMAGE_CAPTURE_CODE) {
        if (resultCode == RESULT_OK) {
            intent.putExtra("done", true);  
        } else if (resultCode == RESULT_CANCELED) {
            intent.putExtra("done", false);     
        }
    }
    finish();
}

我希望保留代码的结构,因为startChallenge()方法是从超类(Challenge)继承的,并且startChallenge在不同类型的挑战中是不同的(例如,有一个需要拍照片的挑战,另一个需要回答问题的挑战等等)。该方法在另一个活动中被调用,具体取决于挑战的类型。

不确定我是否理解了,但是你不能使用startActivityForResult()开始你的活动吗? - natario
1
你不能“等待”。你应该提供一种回调方法,在“挑战”完成时调用该方法。然后,回调方法可以继续处理(无论是什么)。通过这种方式,你将“挑战”的“启动”和“完成”解耦。 - David Wasser
1个回答

1
"

startChallenge应该具有对期望结果返回的Activity的引用,以便能够调用startActivityForResult。

方法

"
@Override    
public boolean startChallenge(Activity activityB) {// Activity B in which you are expecting this result back.
    Intent cam = new Intent(activityB, ActivityA.class);
    activityB.startActivityForResult(cam, REQUEST_CODE_OPEN_CAMERA);
}

活动 A
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    intent = getIntent();
    if (requestCode == CAPTURE_IMAGE_CAPTURE_CODE) {
        if (resultCode == RESULT_OK) {
            intent.putExtra("done", true);  
        } else if (resultCode == RESULT_CANCELED) {
            intent.putExtra("done", false);     
        }
    }

    setResult(RESULT_OK, intent);
    finish();
}

Another approach would be to use LocalBroadcastManager or Otto 活动A
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_CAPTURE_CODE) {
        if (resultCode == RESULT_OK) {
            BusProvider.getInstance().post(new ImageCapturedEvent(true));
        } else if (resultCode == RESULT_CANCELED) {
            BusProvider.getInstance().post(new ImageCapturedEvent(false));
        }
    }

    finish();
}

谢谢您的提问,但我有一个问题:
  • REQUEST_CODE_OPEN_CAMERA在哪里被引用?或者为什么它是必要的? 在哪个时候可以访问intent.getExtra()?
- ch1ll
可以是任何 int 值,用于在 ActivityB 中与 requestCode 进行比较。 - Mostafa Gazar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接