【问题标题】:How much time can be taken inside onDestroy() before the activity is killed?在活动被杀死之前,onDestroy() 内部可以花费多少时间?
【发布时间】:2010-10-21 11:19:58
【问题描述】:

我知道我的问题标题听起来很模糊。但是让我在这里澄清一下。

假设我在中间件堆栈上有一个 android 应用程序。在我的活动的 onCreate() 中,我初始化了我的中间件模块。

在其 onDestroy() 中,我必须取消初始化中间件。现在我的中间件调用可能需要相当长的时间来处理。所以我想知道 onDestroy() 函数有多少时间,看看我的去初始化是否可以在这段时间内发生。

将我的 de-init 保留在 onDestroy() 中是否合理?

另外,假设我在活动 A1 的 onCreate() 中初始化了中间件。单击按钮时,活动 A1 切换到活动 A2。在内存不足的情况下,LMK 会杀死一段时间未使用的活动。在这种情况下,活动A1不会被杀死吗?当活动 A1 被杀死时,我在 A1 中创建的所有实例也会被销毁吗?

问候, 琪琪

【问题讨论】:

    标签: android android-activity destroy


    【解决方案1】:

    我相信你问这个问题很困惑。

    为了更好地理解正在发生的事情,您应该查看可在 developer.android.com 上找到的生命周期图:

    您会看到 Activity.onDestroy() 仅在活动受控关闭的情况下被调用 - 这种情况极少发生,因为 Android 操作系统可以在各种状态下终止您的进程,而无需调用您的 onDestroy()方法。

    什么以及为什么需要取消初始化?

    • 如果您担心释放资源,那么当/如果您的进程被终止时,它们中的大多数都会被释放。
    • 如果您担心保存用户数据(应用程序的状态),那么您应该覆盖onSaveInstanceState()onRestoreInstanceState()

    如果你真的想回答你的问题,那么这里是:

    • 当它运行onDestroy() 时,您的应用程序(可能)有尽可能多的时间 - 它甚至运行onDestroy() 的事实意味着操作系统没有选择它来杀死它。但这很可能无关紧要:一方面,onDestroy 永远不会在大多数应用程序中运行,如果操作系统改变主意并决定你的应用程序必须死掉,即使它正在运行 onDestroy,它也会杀死它。

    【讨论】:

    • @jhominal:关于何时保存用户数据的小注释。应该知道onSaveInstanceState() 只有在应用程序被系统杀死时才会被调用。如果由于用户按下后退按钮或在您的代码中调用finish() 而导致应用程序退出,它将不会触发。因此,如果您想 100% 确定保存当前应用程序状态,则应在 onPause() 中完成。
    • 另外注意:当你说your app has (probably) as much time as it would like to时,这是不正确的。如果您的应用程序有尽可能多的时间,它很容易冻结整个系统。所以 5 秒规则仍然有效。
    • @Nailuj:该应用程序在其自己的 Linux 进程中运行。如果它在onDestroy 方法中开始消耗过多的资源,(用户已经离开应用程序),该进程将被系统毫不客气地杀死 - 但发生这种情况的条件应该与消耗的数量相关联资源而不是特定的持续时间。
    • 另一个注意事项:“5 秒规则”绝不是通用的。它只是说:“如果您的应用程序对用户输入做出反应的时间超过 5 秒,那么我(Android)将向用户显示一个对话框来杀死您。”仅此而已:您的应用程序可能根本不消耗任何资源,但仍会受到该规则的影响(例如,通过在 UI 线程上调用 sleep)。但是在调用onDestroy时,你的应用已经有一段时间不负责用户输入了,所以不适用。
    • @jhominal: 好的,我可以看到执行工作可能不是一个严格的 5 秒规则,但是说你有尽可能多的时间可能有点也关闭 - 因为您无法保证系统在需要资源时不会终止该进程。
    【解决方案2】:

    http://developer.android.com/guide/practices/design/responsiveness.html:

    在 Android 中,系统会防范 应用不足 响应一段时间 向用户显示对话框, 称为应用程序无响应 (ANR) 对话框

    如果您的应用在 5 秒内没有响应,通常会弹出 ANR 对话框。正如 jhominal 所指出的,onDestroy() 方法可能不是您想要进行清理/保存首选项等的地方。

    无论您选择在哪里执行此操作,无论是onDestroy()onSaveInstanceState() 还是onPause(),我相信一般的 5 秒规则都将适用。如果您正在执行的操作超过 5 秒,则会显示 ANR 对话框,并且用户可以选择强制关闭您的应用。

    编辑: 如果您的应用程序在后台,如果您违反了 5 秒规则,它可能(可能?)直接被杀死而没有显示 ANR 对话框。但我不确定,只是假设。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多