onActivityResult只调用一次

时间:2016-09-08 22:35:01

标签: android android-activity android-navigation

我在应用的文件夹选择器部分中有以下活动序列:

活动 A 启动 B B 然后在用户深入文件夹树时启动堆栈本身的实例。每当 B 的实例完成(选择文件夹)时,它和所有前面的 B 应该完成, A 应该再次显示,传播的结果。如果用户回溯,则前面的 B 不应该完成,因为用户应该能够在文件夹子树之间来回切换。

我正在尝试使用startActivityForResult,从 A B ,然后为 B 的每个新实例。当用户完成实例 B 时,我使用setResult并想要在每个前面的实例的onActivityResult方法中检查它。如果它是RESULT_OK,我再次设置结果并完成该实例,直到所有这些实例都以级联顺序完成,并且 A 再次显示结果。

只要我去 A =>该序列就可以正常工作 B(1) => B(2) => B(3)并完成,无需回溯 B 部分。

但是,如果我去 A => B(1) => B(2) =>回到 B(1) => B(3)并完成,onActivityResult仅在第一次从 B(2)返回时在 B(1)中调用,而不是当我后来从 B(3)结束时再回到它。 B(1)在此序列中从 B(3)返回时简单地恢复。这打破了级联完成序列。

为什么onActivityResult仅为实例 B(1)调用一次?每次儿童活动设定结果并结束时,是否应该调用它?

以下是一些代码:

===活动A

启动第一个 B 实例:

Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivityForResult(intent, RequestCodes.ActivityB);

收到最终的 B 结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(resultCode == RESULT_OK){
    ...
  }
}

===活动B

从自己开始新的孩子 B

Intent intent = new Intent(ActivityB.this, ActivityB.class);
startActivityForResult(intent, RequestCodes.ActivityB);

选择文件夹时设置结果:

Intent result = new Intent();
result.putExtra(...);
setResult(Activity.RESULT_OK, result);
finish();

接收孩子 B 导致每个父 B 实例(由于某种原因,这只是第一次在 B(1)中调用):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(resultCode == RESULT_OK){
    setResult(Activity.RESULT_OK, data);
    finish();
  }
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

这是一个可怕的建筑!在遍历树时,您不应创建B的多个实例。最终你会耗尽内存!您应该使用Activity的单个实例,当用户在树中向上或向下移动时,您应该只更改Activity中显示的数据。您应该有一个描述树的内部数据模型,您只需要记住当前显示的树中的哪个节点。如果您还想支持用户返回(通过使用BACK按钮),您可以创建自己的堆栈(不是一堆活动,而只是一堆树节点引用),您可以使用它来确定哪个节点树从当前节点返回。这是一个简单的数据管理问题,您的架构已迫使其成为View管理问题。