Android 应用生命周期向上和向后

Android app lifecycle Up and Back

我有一个应用程序有一些正常行为,但我仍然不知道我做错了什么。

Activity A 调用 --> Activity B 我将 strings/ints 从一个 activity 传递给另一个 (Intent.putExtra()) 我已经将我的活动声明为单个实例,并在我的清单中声明了谁是谁的父级,但是当我打开其他应用程序然后返回我的应用程序时,我所在的 activity 是唯一还活着的。 如果我删除“singleInstance”,那么我的导航可以正常工作,但是从意图(以前的 activity)接收字符串的导航会崩溃。

我希望能够:

考虑到我使用 Intent.putExtra("key", "value")

在活动之间传递值

我认为都与 Back/Up 导航和 android:launchMode=["multiple" | 相关。 "singleTop" | "singleTask" | "singleInstance"]但是我找不到完美的解决方案。

更新: A --> B --> C A->B: A putExtra; B 得到额外的 B->C:B放Extra; C 获得额外

如果我转到 C,离开应用程序然后返回应用程序,应用程序在 C 中,如果我尝试向上导航到 B,它会崩溃,因为我没有附加功能和activity 已终止。 什么是最好的行为?让他们开着?重新创建它们?

http://developer.android.com/design/patterns/navigation.html

向上按钮会将您带到同一应用程序中的上一个 activity 层次结构。 后退按钮会将您带到您的 phone 所在的上一个 screen/app/activity,而不管它属于哪个应用程序。

据我所知,您必须在字符串数据的第二个 activity 示例中设置条件:

if(intent != null){
yourString = intent.getStringExtra("count");
}

那么你必须提供保存实例如

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("count", yourString);//or int or other look on developers
  }

并从实例恢复

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    yourString = savedInstanceState.getString("count");
  }

您尝试实现的行为是 Android 上的默认行为。所以我相信在你的问题上,少即是多。

AndroidManifest.xml:

  • 从中删除所有 parentActivityName。真的一点都不多。
  • 删除所有 launchMode 那些特定的边缘情况,除非您有特定原因和非默认行为,否则不要使用它们。

intent 您传递给活动的参数不会被任何这些清单细节弄乱,我认为它们与您的问题没有任何关系。在任何 activity 上,您都应该能够调用 getIntent().getExtras() 并访问传递给它的任何参数,无论您退出和进入应用程序多少次。

onSaveInstanceStateonRestoreInstanceState 期间,您不需要 save/restore 意图参数。这些回调是针对当前状态的,而不是针对传递给它的参数的。这些是不同的东西。

  • back:这是自动发生的。调用下一个时不能finish();上一个activity
  • up:这只是覆盖 onOptionsItemSelected

    的问题

    @Override public 布尔 onOptionsItemSelected(菜单项){ 开关(item.getItemId()){ // 响应操作栏的 Up/Home 按钮 案例android.R.id.home: 结束(); // 到此结束,将显示上一个。 return; // 其他菜单项 ? } }

if I try to navigate up to B, it crashes because I don't have the extras and the activity has been terminated. What is the best behaviour? Keep them open? Recreate them?

从不 在 Whosebug 上说 "it crashes" 而不提供堆栈跟踪和该堆栈跟踪周围的代码行。这是我给别人投反对票的主要原因之一。

如果它崩溃了,询问那个崩溃,不要搞乱自动默认导航到 "try to fix it"