Getting a result from another Activity
suggest changeBy using startActivityForResult(Intent intent, int requestCode)
you can start another Activity
and then receive a result from that Activity
in the onActivityResult(int requestCode, int resultCode, Intent data)
method. The result will be returned as an Intent
. An intent can contain data via a Bundle
In this example MainActivity
will start a DetailActivity
and then expect a result from it. Each request type should have its own int
request code, so that in the overridden onActivityResult(int requestCode, int resultCode, Intent data)
method in MainActivity
, it can be determined which request to process by comparing values of requestCode
and REQUEST_CODE_EXAMPLE
(though in this example, there is only one).
MainActivity:
public class MainActivity extends Activity {
// Use a unique request code for each use case
private static final int REQUEST_CODE_EXAMPLE = 0x9345;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create a new instance of Intent to start DetailActivity
final Intent intent = new Intent(this, DetailActivity.class);
// Start DetailActivity with the request code
startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
}
// onActivityResult only get called
// when the other Activity previously started using startActivityForResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// First we need to check if the requestCode matches the one we used.
if(requestCode == REQUEST_CODE_EXAMPLE) {
// The resultCode is set by the DetailActivity
// By convention RESULT_OK means that whatever
// DetailActivity did was executed successfully
if(resultCode == Activity.RESULT_OK) {
// Get the result from the returned Intent
final String result = data.getStringExtra(DetailActivity.EXTRA_DATA);
// Use the data - in this case, display it in a Toast.
Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show();
} else {
// setResult wasn't successfully executed by DetailActivity
// Due to some error or flow of control. No data to retrieve.
}
}
}
}
DetailActivity:
public class DetailActivity extends Activity {
// Constant used to identify data sent between Activities.
public static final String EXTRA_DATA = "EXTRA_DATA";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
final Button button = (Button) findViewById(R.id.button);
// When this button is clicked we want to return a result
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Create a new Intent object as container for the result
final Intent data = new Intent();
// Add the required data to be returned to the MainActivity
data.putExtra(EXTRA_DATA, "Some interesting data!");
// Set the resultCode as Activity.RESULT_OK to
// indicate a success and attach the Intent
// which contains our result data
setResult(Activity.RESULT_OK, data);
// With finish() we close the DetailActivity to
// return back to MainActivity
finish();
}
});
}
@Override
public void onBackPressed() {
// When the user hits the back button set the resultCode
// as Activity.RESULT_CANCELED to indicate a failure
setResult(Activity.RESULT_CANCELED);
super.onBackPressed();
}
}
A few things you need to be aware of:
- Data is only returned once you call
finish()
. You need to callsetResult()
before callingfinish()
, otherwise, no result will be returned. - Make sure your
Activity
is not usingandroid:launchMode="singleTask"
, or it will cause theActivity
to run in a separate task and therefore you will not receive a result from it. If yourActivity
usessingleTask
as launch mode, it will callonActivityResult()
immediately with a result code ofActivity.RESULT_CANCELED
. - Be careful when using
android:launchMode="singleInstance"
. On devices before Lollipop (Android 5.0, API Level 21), Activities will not return a result. - You can use explicit or implicit intents when you call
startActivityForResult()
. When starting one of your own activities to receive a result, you should use an explicit intent to ensure that you receive the expected result. An explicitintent
is always delivered to its target, no matter what it contains; thefilter
is not consulted. But an implicit intent is delivered to a component only if it can pass through one of the component’s filters.
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents