【问题标题】:android - data stored in onPause, onStop or onSaveInstanceStateandroid - 存储在 onPause、onStop 或 onSaveInstanceState 中的数据
【发布时间】:2013-02-02 21:10:41
【问题描述】:

我对 onPauseonStoponSaveInstanceState 中的内容感到困惑。例如,Android 文档说 对于onPause -

提交未保存的更改,但前提是用户希望在他们离开时永久保存此类更改(例如草稿电子邮件)。

对于onStop-

您应该使用 onStop() 来执行更大、更占用 CPU 的关闭操作,例如将信息写入数据库。

对于onSaveInstanceState

您的 Activity 可能有更多您想要恢复的状态信息,例如跟踪用户在 Activity 中的进度的成员变量。

难道这三样东西基本上都指向存储诸如表单或电子邮件之类的信息吗?那应该用什么方法保存呢?

【问题讨论】:

    标签: android save state


    【解决方案1】:

    您想要持久化的所有内容都必须存储在 onPause() 中,因为某些 Android 版本认为您的应用在 onPause() 返回后是可终止的。

    由于onPause() 相对频繁地出现,并且在许多情况下您可能不会为同一活动的onResume() 保存状态,因此做出了有些不清楚的区别。因此,每个人都希望您在 onPause() 执行昂贵的操作之前三思而后行。

    关于存储表单数据的问题,好吧,如果确实完全打算让用户在停止应用程序并重新启动后看到相同的表单数据,那么您可以在输入字段失去焦点时将其持久化。

    【讨论】:

    • onStop() 保证从 Honeycomb (3.0) 开始被调用,截至 2016 年 1 月,它占 Android 设备的 96.8%。所以我现在更喜欢使用 onStop() 而不是 onPause() 来保存数据.
    • @VickyChijwani 从软件工程的角度来看,首选 onStop() 而不是onPause() 是不可接受的,除非您在您的系统中明确要求 Android 3.0应用的元数据(你没有提到)。
    • 对,我确实为 Android 3.0 及更高版本制作了我的应用程序,应该提到这一点。我更喜欢onStop() 的另一个(有争议的)原因是因为onPause() docs 中的这一行:“当在活动A 之前启动活动B 时,......在A 的onPause() 返回之前不会创建B,所以一定不要在这里做任何冗长的事情。”当然,整个生命周期文档仍然很混乱,所以这不是结论性的。
    • @VickyChijwani 在onPause() 中想要做的事情有很多,而在onStop() 中却做不到。当然,除非您的应用程序不执行任何这些操作。但是很有可能一个在onPause() 中不做任何事情的应用程序表现不佳。毕竟,onPause() 是在应用停止与用户交互时调用的,只是稍后才能恢复。
    【解决方案2】:

    对于 2016 年或之后来到这里的任何人,请注意 @Class Stacker 的答案在这一点上已经过时了。具体来说,从 Android 3.0 (Honeycomb) 开始,保证会调用 onStop(),截至 2016 年 1 月,96.8% of Android devices

    在此处查看生命周期文档:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle(Ctrl+F 表示“未处于可终止状态”)

    更新:正如 cmets 中正确指出的那样,这当然意味着您的应用必须仅限于 Android 3.0 及更高版本。

    【讨论】:

    • 只是为了再次说明这一点(也如上所述),百分比本身并不是一个足够的点。在onPause() 中不解决持久性问题的应用程序必须严格限制为 Android 3 及更高版本。
    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多