【问题标题】:onDestroy() won't get called after this.finish()在 this.finish() 之后不会调用 onDestroy()
【发布时间】:2011-03-03 10:49:19
【问题描述】:

我想知道为什么带有 2.1-update1 的 Motorola Milestone 的行为与 Emulator 或 e.g. 不同。连结一号。我正在尝试退出我的应用程序:

@Override
protected void onPause() {
    if(mayDestroyActivity) this.finish();
    super.onPause();
}

这在 Emulator 或 Nexus One 上运行良好。在onPause()onStop 之后立即调用onDestroy()。但不适用于里程碑。相反,onDestroy() 在另一个 Activity 启动时被调用。它在 Manifest 中的部分如下所示:

<activity android:name=".MyActivity"  
    android:configChanges="orientation|keyboardHidden"  
 android:label="@string/questionnaire_item"
 android:launchMode="singleInstance"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
 android:windowSoftInputMode="adjustPan">
 <intent-filter>
  <category android:name="android.intent.category.OPENABLE" />
 </intent-filter>
</activity>

有人对此有提示吗?我的应用程序依赖于正确退出,因为我将所有进度保存在 onDestroy()

谢谢,
斯特夫

【问题讨论】:

    标签: android milestone


    【解决方案1】:

    如果用户退出到主屏幕,这并不意味着应该退出应用程序。在大多数情况下,如果应用程序只是进入后台,它将提供更好的用户体验。尝试依赖 saveInstanceState 和 onPause。

    在 Android 世界中,退出应用程序被视为一种不好的做法,如果应用程序在按下主屏幕后继续运行,则配备具有良好系统的真正多点触控的手机可以获得更好的用户体验。

    【讨论】:

    • 谢谢,我想通了。里程碑的不同行为使我终于以正确的方式看待事情。奇怪但有趣且有用...
    【解决方案2】:

    你应该使用onSaveInstanceState,查看this链接。

    【讨论】:

      【解决方案3】:

      你做错了。文档是这样说的:

      注意:不要指望这种方法 被称为储蓄的地方 数据! [...] 在某些情况下 系统将简单地杀死 活动的托管过程没有 在中调用此方法(或任何其他方法) 它,所以它不应该用来做 打算保留的东西 在进程消失后左右。

      http://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29

      【讨论】:

      • 你是对的,我的方法是错误的。但无论如何,我希望我的应用在用户退出到主屏幕时传递 onDestroy()。
      • 没有办法正确地做错误的方法。 “在某些情况下,系统会简单地终止活动的托管进程而不调用此方法”是您应该从字面上理解的陈述。
      • 你又是对的。我将所有内容移至 onPause()。也可以。谢谢
      • @stfn 感谢您提到 onPause()。我也遇到了这个问题,将 finish() 从 onStop() 移到 onPause(),现在调用了 onDestroy()。
      猜你喜欢
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多