I am trying to setResult after the BACK button was pressed. I call in onDestroy
Intent data = new Intent();
setResult(RESULT_OK, data)
But
i paste the answer may be will be helpful to other people: when a set launcheMode with android:launchMode="singleTask" i also cant get the result, the doc says:
/* <p>Note that this method should only be used with Intent protocols
* that are defined to return a result. In other protocols (such as
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
* not get the result when you expect. For example, if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result.
*/
and:
/* <p>As a special case, if you call startActivityForResult() with a requestCode
* >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
* activity, then your window will not be displayed until a result is
* returned back from the started activity. This is to avoid visible
* flickering when redirecting to another activity.
*/
Activity
result must be set before finish()
is called. Clicking BACK actually calls finish()
on your activity
, so you can use the following snippet:
@Override
public void finish() {
Intent data = new Intent();
setResult(RESULT_OK, data);
super.finish();
}
If you call NavUtils.navigateUpFromSameTask();
in onOptionsItemSelected()
, finish()
is called, but you will get the wrong result code
. So you have to call finish()
not navigateUpFromSameTask
in onOptionsItemSelected()
.
wrong requestCode in onActivityResult
Try overriding onBackPressed (from android level 5 up), or override onKeyDown() and catch KeyEvent.BUTTON_BACK (see Android Activity Results) This does the trick for me.
You need to overide the onBackPressed()
method and set the result before the call to superclass, i.e
@Override
public void onBackPressed() {
Bundle bundle = new Bundle();
bundle.putString(FIELD_A, mA.getText().toString());
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
super.onBackPressed();
}
onDestroy
is too late in the chain — instead override onPause
and check isFinishing()
to check if your activity is at the end of its lifecycle.
Don't rely on any logic executed in onPause of one activity when you return to the initial one. According to the docs:
Implementations of this method (onPause) must be very quick because the next activity will not be resumed until this method returns
See http://goo.gl/8S2Y for details.
The safest way is to set result after each result altering operation is complete (as you mention in your answer)