我想在按下返回键后设置setResult。 我在onDestroy中调用此函数。
Intent data = new Intent();
setResult(RESULT_OK, data)
但是,当涉及到
onActivityResult(int requestCode, int resultCode, Intent data)
resultCode为0(RESULT_CANCELED),data为“null”。
那么,我如何从通过BACK按钮终止的activity中传递结果?
我想在按下返回键后设置setResult。 我在onDestroy中调用此函数。
Intent data = new Intent();
setResult(RESULT_OK, data)
但是,当涉及到
onActivityResult(int requestCode, int resultCode, Intent data)
resultCode为0(RESULT_CANCELED),data为“null”。
那么,我如何从通过BACK按钮终止的activity中传递结果?
您需要重写onBackPressed()
方法并在调用超类之前设置结果,即
@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();
}
Activity
结果必须在调用finish()
之前设置。点击返回按钮实际上会在你的activity
上调用finish()
,因此你可以使用以下代码片段:
@Override
public void finish() {
Intent data = new Intent();
setResult(RESULT_OK, data);
super.finish();
}
onOptionsItemSelected()
中调用NavUtils.navigateUpFromSameTask();
,会调用finish()
,但是你会得到错误的result code
。因此,在onOptionsItemSelected()
中,你必须调用finish()
而不是navigateUpFromSameTask
。在onActivityResult中requestCode错误
finish
和 onPause
、onDestroy
有什么关系?除了 finish
开始终止进程之外,它们完全没有关联。 - JBMonBackPressed
似乎不再起作用。 - avalerio如果您想在onBackPressed
事件中设置一些自定义的RESULT_CODE
,那么您需要先设置result
,然后调用super.onBackPressed()
,然后您将在调用者活动的onActivityResult
方法中收到相同的RESULT_CODE
。
@Override
public void onBackPressed()
{
setResult(SOME_INTEGER);
super.onBackPressed();
}
我重构了我的代码。最初,我准备了一些数据,并在onDestroy
中将其设置为activity result
(但这并没有起作用)。现在,每当要返回的数据更新时,我都会设置activity
数据,并且在onDestroy
中没有任何操作。
setResult()
后,您的活动被重新创建,则您的数据将会丢失。 - Jarett Millard@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
final Intent mIntent = new Intent();
mIntent.putExtra("param", "value");
setResult(RESULT_OK, mIntent);
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
请参考onActivityResult(int, int, Intent)文件
解决方案是检查resultCode是否为Activity.RESULT_CENCELED。如果是,那么它意味着BACK被按下或活动崩溃了。希望这对你们有用,对我有效 :).
/* <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.
*/
并且:
/* <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.
*/
onDestroy
在生命周期中太晚了,应该重写onPause
并检查isFinishing()
来确定您的活动是否已经结束。
尝试覆盖onBackPressed(从Android 5级及以上),或覆盖onKeyDown()并捕获KeyEvent.BUTTON_BACK(请参见{{link1:Android Activity Results}}) 这对我很有用。
当您返回到初始活动时,不要依赖于在onPause中执行的任何逻辑。根据文档:
此方法(onPause)的实现必须非常快,因为在此方法返回之前,下一个活动将不会恢复
有关详细信息,请参见http://goo.gl/8S2Y。
最安全的方法是在每个结果更改操作完成后设置结果(如您在答案中提到的)。