【问题标题】:Save data in activity's onDestroy method在活动的 onDestroy 方法中保存数据
【发布时间】:2012-12-19 16:15:35
【问题描述】:

我正在编写一个任务列表并拥有一个包含所有任务(和元数据)的 Project 对象。我使用操作日志,因此当任务更改时,我不会立即将其保存到数据库中,只需将其保存在内存中,以便在活动完成时转储到数据库中。 Activity 的 onDestroy 方法是最好的地方:如果没有调用 onRetainNonConfigurationInstance 方法,我启动服务来保存项目(一个实例存储在应用程序中)。保存是昂贵的:在数据库项目中有修订,所以我保存新数据,更改当前修订并删除以前修订的数据。所以我不怕突然申请停止。

但是,根据to documentation 我必须do not count on this method being called as a place for saving data.

还有其他地方可以保存我的数据吗?

【问题讨论】:

    标签: android android-service android-sqlite ondestroy


    【解决方案1】:

    OnDestroy 并不总是会被调用。来自生命周期文档——

    当您的活动收到对 onStop() 方法的调用时,它不是 更长的可见性并且应该释放几乎所有不可见的资源 用户不使用时需要。一旦你的活动停止, 如果需要恢复系统,系统可能会破坏实例 记忆。在极端情况下,系统可能会简单地杀死您的应用程序 进程不调用活动的最终 onDestroy() 回调,所以 使用 onStop() 释放可能泄漏的资源很重要 记忆。

    虽然 onPause() 方法在 onStop() 之前被调用,但你应该 使用 onStop() 执行更大、更占用 CPU 的关机 操作,例如将信息写入数据库

    Stop Your Activity

    【讨论】:

    • 将您的数据保存在OnStop()。它总是会被调用。
    • onStop 在 onRetainNonConfigurationInstance 之前调用,所以我可能不知道它是完成活动,还是只是改变方向。
    • 确实如此。检查点配置更改数据的缺点是什么?您始终可以通过在清单中添加 android:configChanges="keyboardHidden|orientation 或类似内容来自行处理配置更改。有关利弊,请参阅this question/answer
    • 另一种选择是,如果您正在使用片段,则可以在配置更改时将片段与操作日志一起保留。
    • @iagreen,不会总是调用 OnStop()。虽然它是我们应该保存数据、释放内存的地方,......“请注意,在内存不足的情况下,系统没有足够的内存来保持活动进程在其 onPause() 方法后运行时,可能永远不会调用此方法调用。”
    【解决方案2】:

    您不应该使用onDestroy() 方法来保存数据。相反,您应该使用内部/外部存储空间或在onPause() 方法中编写代码。

    【讨论】:

    • onPause 可能被称为非常频繁,并且保存过程很昂贵。
    【解决方案3】:

    你应该使用onStop

    Activity docs

    您也可以使用onPause,但只要您离开Activity,就会调用它,包括关闭屏幕。

    【讨论】:

    • onStop 在 onRetainNonConfigurationInstance 之前调用,所以我可能不知道它是完成活动,还是只是方向改变。
    • 我不完全明白为什么您不只是在活动运行时写入数据库...您可以在单独的线程中执行此操作并使用加载程序 API 来确保一切正常同步...对我来说似乎是一种更好的设计模式。以你的方式,你总是冒着人们关掉手机或操作系统积极回收内存的风险,或者谁知道还有什么。
    • 我使用动作日志,所以突然的应用程序终止不是问题。也许我会在活动运行时使用一些计时器并定期存储数据。
    【解决方案4】:

    根据Activity Lifecycle documentation,您应该将数据保存在onPause()onSaveInstanceState(Bundle)

    在 Activity 关闭之前,可能永远不会调用方法 onDestroy()onStop()

    摘自Activity Lifecycle documentation

    受保护的无效 onDestroy ()

    注意:不要指望调用此方法作为保存位置 数据!例如,如果活动正在编辑内容中的数据 提供者,这些编辑应该提交到onPause() onSaveInstanceState(Bundle),不在这里。

    受保护的无效 onStop ()

    请注意,在系统没有内存的低内存情况下,可能永远不会调用此方法 在调用 onPause() 方法后,有足够的内存来保持 Activity 的进程运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      相关资源
      最近更新 更多