【问题标题】:OnCreate runs after back button is pressedOnCreate 在按下后退按钮后运行
【发布时间】:2014-07-03 22:29:17
【问题描述】:

我试图了解当用户按下背面并且我没有覆盖 onOptionsItemSelected 时引擎盖下会发生什么。

我有以下场景:

  1. intent.putExtra("abc", "abc"); 的活动 A
  2. getIntent()onCreate() 中的活动 B
  3. 活动 C

当用户在活动 C 中点击返回时,究竟会发生什么?

如果我不覆盖后退按钮,按下后退将在 getIntent 行上产生 nullException。为什么?它在onCreate() 中,而不是在onStart() 中。

如果我使用onSaveInstanceState,捆绑总是空的。这使我假设 back 正在创建 Activity 的新实例。为什么?它应该自己完成。

如果我用finish() 覆盖后退按钮,它不再崩溃,但我认为后退的默认行为是运行finish()

编辑更多细节:

我在每个生命周期方法中都放了一个祝酒词,我发现 Activity B 在我按下 Activity C 之后调用了 destroy。这对我来说毫无意义!

清单:

活动 A

<activity
    android:name=".activities.MainActivity"
    android:configChanges="orientation"
    android:screenOrientation="portrait"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

活动 B

<activity
    android:name=".activities.MenuActivity"
    android:configChanges="orientation"
    android:screenOrientation="portrait"
    android:label="@string/menu_title"
    android:parentActivityName=".activities.MainActivity">
</activity>

活动 C

<activity
    android:name=".activities.OptionActivity"
    android:configChanges="orientation"
    android:screenOrientation="portrait"
    android:label="@string/option_title"
    android:parentActivityName=".activities.MenuActivity">
</activity>

【问题讨论】:

  • 当用户在活动 C 中点击返回时会发生什么取决于在调用活动 C 之前是否从活动 B 调用了“finish()”
  • 活动 B 中没有 finish(),这就是我不明白的原因。
  • 我们可以看看你的代码吗?还有日志。
  • 我在 Activity C 中没有代码,这就是我可以编写代码来防止崩溃的重点,但我想了解为什么我必须这样做。我根本不覆盖后退按钮。导致崩溃的行在 Activity B 中:this.getIntent().getExtras().getString(STATE_REST) 并且该 Activity 显示 nullException,因为它正在重新创建并且没有意图。我的问题是为什么当我点击 Activity C 时 Activity B 会被破坏。
  • 你能发布你的清单文件吗?看看您如何在此处指定“活动 B”可能会有所帮助。

标签: android


【解决方案1】:

为什么当我点击 Activity C 时,Activity B 会被销毁?

在开始活动之前,您是否使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 表示意图。它将清除backstack,当您按下返回时,将重新创建活动。

更新:

不要依赖onDestroy() 的调用,因为它可能会或可能不会在按下后退按钮时被调用。 但是,它保证会在调用 finish() 时被调用,但不一定会在按下后退按钮时被调用。

Activity OnDestroy never called?

【讨论】:

  • 不,我没有,但那确实会调用onDestroy()
  • 你的意思是onDestroy()方法不是为Activity C调用而是为Activity B调用的?
  • 它也被(正确地)为 C 调用,但不应该为 B 调用。
  • 不要依赖 onDestroy() 的调用,因为它可能会或可能不会在按下后退按钮时被调用。检查这个 - stackoverflow.com/questions/4449955/…
  • 我不依赖它。我是说当我回击时不应该调用它,但出于某种原因它是。总是!这不应该根据文档发生,因为它应该只在系统需要空间时调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多