How to return a result through multiple activities

守給你的承諾、 提交于 2019-12-17 21:40:12

问题


in some part of my application there is a structure of activities like this:

Activity A is my home activity where I come back after each process or flow.
Activity B is a simple confirmation activity.
Activity C is another confirmation activity.
Activity D does some process and finally it gets back the result to my home activity (Activity A).

Requirements:

Activity B and C:

  • must be there and cannot be merged in one.
  • when it is clicked on the cancel button it calls finish() and does nothing.
  • when it is clicked on the OK button it follows the flow and the current activity calls finish()

Question:

I was thinking about using startActivityForResult() but I have never used it to pass a result through multiple activities..
I also was thinking to pass a handler (created in Activity A) which calls some method on Activity A and is executed on Activity D...

How could I implement it?


回答1:


You might like to make use of the intent flag FLAG_ACTIVITY_FORWARD_RESULT as described in Intent when starting activities B and C

public static final int FLAG_ACTIVITY_FORWARD_RESULT

Since: API Level 1

If set and this intent is being used to launch a new activity from an existing one, then the reply target of the existing activity will be transfered to the new activity. This way the new activity can call setResult(int) and have that result sent back to the reply target of the original activity.

That way A should pick up any data sent back in the extras sent back from D




回答2:


Yup, great formatting. And you can -- and probably should -- definitely call startActivityForResult() from each of Activity A, B, and C (and don't finish() right away). In B and C you can check for a successful result and finish(), passing the result on back to A.

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if((resultCode == RESULT_OK) && (requestCode == MY_RESULT_CODE)) {
        setResult(RESULT_OK, data);
        finish();
    }
}

If you want B and C to disappear regardless, do the following instead:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    setResult(resultCode, data);
    finish();
}



回答3:


I know this is a really old question but I wanted to put in a valid solution, use onNewIntent() and treat it as onActivityResult().

In activity D you would structure your intent as

Intent intent = new Intent(yourContext, Activity_A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("someName", data);
startActivity(intent);
finish();

and then in Activity_A

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // update your UI
    intent.getSerializableExtra(...
}



回答4:


You could do B and C as dialogs that are fired from A and only if B and C are ok, you run D with startActivityForResult()



来源:https://stackoverflow.com/questions/9135449/how-to-return-a-result-through-multiple-activities

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!