当被调用的Activity退出时,如何以"自然的方式"返回结果?

cor*_*OLO 10 android

什么工作正常

我的应用程序中有2个活动.第一项活动称第二次获得结果.

第二个活动显示新布局,并允许用户执行某些操作.有一个"确定"按钮.当用户按下此按钮时,第二个活动结束,用户返回第一个活动.

在引擎盖下,第一个活动调用第二个活动,如下所示:

Intent intent = new Intent(this, NextAct.class);
intent.putExtra("input", input);
this.startActivityForResult(intent, 99);
Run Code Online (Sandbox Code Playgroud)

按"确定"按钮,第二个活动返回结果如下:

Intent intent = new Intent();
intent.putExtra("output", output);
setResult(RESULT_OK, intent);
finish();
Run Code Online (Sandbox Code Playgroud)

之后,第一个活动的onActivityResult被成功调用结果:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // requestCode is 99
    // resultCode is -1
    // data holds my output
}
Run Code Online (Sandbox Code Playgroud)

以上设置工作正常

什么不起作用

现在我有一个简单的要求,我希望用户不要使用"OK"按钮关闭第二个活动,而是以"HARDWARE BACK"按钮自然地关闭.

我尝试在第二个活动的onStoponDestroy方法中移动setResult逻辑,但事实证明第一个活动的onActivityResult在第二个活动的onStoponDestroy方法之前被调用,因此setResult逻辑根本没有机会运行.

然后我尝试在第二个活动的onPause方法中移动setResult逻辑,就像这样

protected void onPause() {
  super.onPause();
  Intent intent = new Intent();
  intent.putExtra("output", output);
  setResult(RESULT_OK, intent);
  //finish();  enabling or disabling this does not work
}
Run Code Online (Sandbox Code Playgroud)

但是虽然在onActivityResultsetResult逻辑正常运行之前调用了onPause,但仍然在onActivityResult中获取所有空值

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // requestCode is 99
    // resultCode is 0
    // data comes as null
}
Run Code Online (Sandbox Code Playgroud)

我需要知道为什么会发生这种情况,如果onResume不是放置setResult逻辑的合适位置,那么最自然的方法是什么?

非常感谢.

Com*_*are 13

现在我有一个简单的要求,我希望用户不要使用"OK"按钮关闭第二个活动,而是以"HARDWARE BACK"按钮自然地关闭.

对于startActivityForResult()场景而言,这通常不是"自然的" .BACK按钮应该允许用户告诉你"不,它不正常"(即取消).

这并不意味着你必须有一个OK按钮.例如,如果NextAct是a ListActivity,则典型模式是单击列表项以被视为"OK"(即,call setResult()finish()from onListItemClick()),而BACK表示"我真的不想开始NextAct,抱歉".

我需要知道为什么会这样

你来电setResult()太晚了.如果用户按下BACK,则到时onPause(),结果(RESULT_CANCELED)已经确定.

如果onResume不是放置setResult逻辑的适当位置

onResume() 不会是"放置setResult逻辑"的合适位置

什么是最自然的方式呢?

可能你点击OK按钮就是"最自然的方式".

但是,如果由于某些奇怪的原因你确实希望BACK按钮表示"OK",则在链接到超类之前覆盖onBackPressed()并调用setResult()super.onBackPressed().


Ale*_*xey 9

我发现的最好方法是覆盖finish()方法:

@Override
public void finish() {
    Intent data = new Intent();
    data.putExtra(INTENT_PARAM_OPTIONS, options);
    setResult(RESULT_OK, data);
    super.finish();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,即使用户按下后退按钮(或活动栏向上按钮),您的活动也将始终返回数据.

我认为在某些情况下这样做是完全自然的.如果您有一项活动用于编辑一个大型实体(例如装运订单),并且该活动中的一个较小的活动会修改大型实体的一小部分(送货地址),您可能还会将所有更改保存在较小的活动中,因为用户可以通过取消大活动来取消所有更改.