我按下BACK按钮后尝试setResult。我打电话给onDestroy
Intent data = new Intent();
setResult(RESULT_OK, data)
但是谈到
onActivityResult(int requestCode, int resultCode, Intent data)
resultCode为0(RESULT_CANCELED),数据为'null'。
那么,如何通过BACK按钮终止的活动传递结果?
答案 0 :(得分:147)
你需要覆盖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();
}
答案 1 :(得分:64)
Activity
结果必须在调用 finish()
之前设置为。点击后退实际上会在finish()
上调用activity
,因此您可以使用以下代码段:
@Override
public void finish() {
Intent data = new Intent();
setResult(RESULT_OK, data);
super.finish();
}
如果您在NavUtils.navigateUpFromSameTask();
中致电onOptionsItemSelected()
,则会调用finish()
,但您将收到错误的result code
。因此,您必须在finish()
中致电navigateUpFromSameTask
而不是onOptionsItemSelected()
。
wrong requestCode in onActivityResult
答案 2 :(得分:16)
如果您想在RESULT_CODE
事件中设置一些自定义onBackPressed
,则需要先设置result
,然后调用super.onBackPressed()
,您将收到相同的RESULT_CODE
调用者活动的onActivityResult
方法
@Override
public void onBackPressed()
{
setResult(SOME_INTEGER);
super.onBackPressed();
}
答案 3 :(得分:9)
我重构了我的代码。最初我准备了一些数据,并在activity result
中将其设置为onDestroy
(这不起作用)。现在,每次更新要返回的数据时,我都会设置activity
数据,onDestroy
中没有任何内容。
答案 4 :(得分:3)
参考onActivityResult(int, int, Intent) doc
解决方法是检查 resultCode 的值 Activity.RESULT_CENCELED 。如果是,则表示按下了BACK或活动崩溃。希望它适合你们,为我工作:)。
答案 5 :(得分:3)
您应该覆盖 onOptionsItemSelected ,如下所示:
@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);
}
}
答案 6 :(得分:0)
onDestroy
在链中太晚了 - 而是覆盖onPause
并检查isFinishing()
以检查您的活动是否处于其生命周期的末尾。
答案 7 :(得分:0)
尝试覆盖onBackPressed(从android级别5开始),或覆盖onKeyDown()并捕获KeyEvent.BUTTON_BACK(参见Android Activity Results) 这对我有用。
答案 8 :(得分:0)
当您返回初始活动时,不要依赖于onPause中执行的任何逻辑。根据文件:
此方法的实现(onPause)必须非常快,因为 在此方法返回
之前,不会恢复下一个活动
有关详细信息,请参阅http://goo.gl/8S2Y。
最安全的方法是在每次结果更改操作完成后设置结果(正如您在答案中提到的那样)
答案 9 :(得分:0)
我粘贴答案可能对其他人有帮助: 当一个设置launcheMode与android:launchMode =“singleTask” 我也无法得到结果, 医生说:
/* <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.
*/