【问题标题】:Wait for activity to finish in non-activity class在非活动类中等待活动完成
【发布时间】:2014-12-29 11:17:14
【问题描述】:

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

在原始方法中,我想阅读这个捆绑包,它不起作用,因为活动尚未完成。

我如何才能等待活动完成才能继续我的方法?

方法

@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() 开始你的活动吗?
  • 你不能“等待”。您应该提供某种在“挑战”完成时调用的回调方法。然后回调方法可以继续该过程(无论是什么)。通过这种方式,您可以将挑战的“开始”和挑战的“完成”解耦。

标签: android android-intent android-activity


【解决方案1】:

startChallenge 应该有一个对期望返回结果能够调用 startActivityForResult 的 Activity 的引用

方法

@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();
}

另一种方法是使用LocalBroadcastManagerOtto

活动 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()?
  • 它可以是任何 int 值来检查 ActivityB 中的 requestCode
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多