Activity 向后导航时崩溃

Activity crashes while navigating back

全部,

我正在 3 个相互依赖的屏幕之间执行导航。

Activity A 有一个 table 列表 table 行。每行都有 onclick 侦听器事件,其中从 table 行获取数据并传递到下一个屏幕 Activity B.

Activity B 从 Intent 中读取数据,获取相应的图片数据等,构建布局。它有一个按钮,从编辑文本中读取数据并传递给 Activity C.

Activity C 也根据 Intent 中的数据构建布局。

我通过清单文件中的 Parent activity 配置实现了这些活动之间的导航。

现在,当我在 Activity C 中向后导航到 Activity B 时,它崩溃了,因为它无法从 Intent 中找到数据,因为控件来自 Child 到 Parent 而不是 Parent 到 Child.

我了解到 Activity B 的 onCreate 函数正在再次执行。所以我在 Activity B 中保留了 onPause() 和 onResume() 方法来保持 re-execution。但是运气不好。

有人可以建议如何处理这种情况。

编辑:

Activity乙:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_activity);
getActionBar().setDisplayHomeAsUpEnabled(true);
source_activity = this.getIntent().getStringExtra("source_activity");
Bundle b = this.getIntent().getExtras();
if(b!=null)
  DashBoardDisplay_l = b.getParcelable("obj");
Name_ref=DashBoardDisplay_l.getName();
}

Activity C:

protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.activity_open_translate,R.anim.activity_close_scale);
setContentView(R.layout.point_log_activity);
Intent intent = getIntent();
String YourtransferredData = intent.getExtras().getString("ref_name");
Log.d(TAG, "ref name "+YourtransferredData);
Name=YourtransferredData;
Log.d(TAG, "name value "+Name);
getActionBar().setDisplayHomeAsUpEnabled(true);
new BackEndJob().execute();
}

Activity B 包含一些来自先前屏幕 Activity A 的 Intent。因此,当从 Activity C 返回到 Activity B 时,它找不到来自 Intent 的数据导致空指针异常。

那么是否有任何选项可以显示后退导航堆栈中的内容,而不是使用 Dalija 建议的 Savedinstance 重新创建它。

根据您的描述,似乎应该阻止向后导航到 Activity B。因此,当用户在 Activity C 中按下后退按钮时,它将返回到 Activity A。如果是这种情况,那么当它把控制权传递给 [=27= 时,你应该完成 Activity B ] C.

...
  this.startActivity(intent); // start Activity C 
  finish();
}

完成 activity 将从导航堆栈中删除 Activity B 并完全销毁 Activity B 解决您的后退导航问题。

但是,如果您确实想导航回 Activity B,那么您应该在 Activity B 中使用 onSaveInstanceState()onRestoreInstanceState() 来保存其状态。

Recreating Activity

当您启动 Activity C 时,Activity B 会停止。届时,如果需要清理资源,系统可能会决定随时销毁 Activity B。您对该过程没有任何影响,也无法阻止它。

您可以在 Activity Lifecycle

中找到更多信息