非调用Activity是否可以通过Intent将结果返回到初始Activity?

时间:2015-05-07 14:12:38

标签: android android-intent android-activity onactivityresult

流程是这样的:

调用B(通过startActivityForResult)加载一组图像。在用户选择一个或多个图像之后,B调用C,其中用户可以进一步对图像进行排序。完成此步骤后,C调用A调用setResult(someResult, someIntent)

A中发生的是我收到了正确的请求代码,结果代码,但null意图。

A期望从它首先调用的类中获得intent吗?

我认为确实如此,我将此意图从B传递给C,但在C中我不得不处理该意图,因为B必须将自己的意图传递给A。

4 个答案:

答案 0 :(得分:5)

这正是Intent.FLAG_ACTIVITY_FORWARD_RESULT的用途: - )

A应该使用startActivityForResult()启动B.将使用结果调用A onActivityResult()

B应使用以下内容启动C:

Intent intent = new Intent(this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.putExtra("...", ...); // If you need to pass additional data to C
startActivity(intent);
finish();

请注意,B使用startActivity()代替startActivityForResult()启动C.但是,因为您指定了Intent.FLAG_ACTIVITY_FORWARD_RESULT,所以C现在可以将结果返回给A(最初启动B的活动)。

在C语言中,您只需拨打setResult()finish()即可将结果返回给A.

答案 1 :(得分:3)

您不应该从A拨打C,而是在setResult()中呼叫C,然后在finish() C呼叫,在{ {1}}然后立即B finish()(来自B),并在onActivityResult()A)中获得最终结果。

流程将是:

onActivityResult()

答案 2 :(得分:2)

那么你可以调用onActivityResult两次从活动C转到活动A,让我用一个简单的例子进一步解释......

在A中你使用activityforResult调用b ...如果onResult带有正确的结果代码,那么它在C之后从B返回然后获取数据并做一些事情...... 活动A:

public class ActivityA extends Activity{
    public static int A_REQUEST_CODE = 13215564;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        Intent i = new Intent(this, ActivityB.class);
        startActivityForResult(i, A_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

            if (resultCode == ActivityB.B_RESULT_CODE){
                //get the data an work on it
                data.getExtras().getString("CHANGE"); // Changed image
            }
    }
}

然后在B中,你在选择图像后用ActivityforResult调用C,检查是否有任何结果来自C(意味着将从C返回),如果那样的情况则返回A并传递意图

活动B:

public class ActivityB extends Activity {
    public static int B_REQUEST_CODE = 64684687;
    public static int B_RESULT_CODE = 64004684;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent i = new Intent(this,ActivityC.class);
        Bundle info = new Bundle();
        info.putString("IMAGE", "IMAGE_PATH");
        startActivityForResult(i,B_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == B_REQUEST_CODE && resultCode == ActivityC.C_RESULT_CODE){
            setResult(B_RESULT_CODE,data);
            finish();
        }
    }
}

在C中只需处理数据并使用正确的结果集返回c

活动C:

public class ActivityC extends Activity {

    public static int C_RESULT_CODE = 654846622;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String imageString = getIntent().getExtras().getString("IMAGE");
        //Work on the image then
        Intent i = new Intent();
        Bundle b = new Bundle();
        b.putString("CHANGE", "the changed image");
        i.putExtras(b);

        setResult(C_RESULT_CODE, i);
        finish();
    }
}

希望它有助于好运:))

答案 3 :(得分:0)

要么将您的架构更改为片段......并在主机活动中处理此数据,

不要B只使用startActivityForResult并浏览活动,当图片已经排序或C活动中的任何内容时,再次startActivity将您的数据作为Extra意图,现在回到活动A,在onCreate方法中,检查startActivity(A)getIntent方法,如果有,意味着你要发回数据,所以做你想做的任何事情。 hasExtra

再次,碎片方法更好,当然

编辑: 刚刚看到@ shkschneider的答案,如果你坚持使用活动,那似乎是合法的