【问题标题】:Android activity lifecycle question: When to commit GlobalPreferencesAndroid Activity 生命周期问题:何时提交 GlobalPreferences
【发布时间】:2011-04-20 15:42:48
【问题描述】:

我有一堆用户首选项保存在我的应用程序的单例对象中。示例模型如下所示 -

public class UserContext {
    public static final String WEBSRV_IP = "TRIMMED";
    public static UserContext instance;
    // Contains username, password, if they're valid etc.
    private LoginDataModel loginModel; 
    private ArrayList<FacilityDataModel> model;
    private FilterDataModel filters;

    private UserContext()
    {

    }

    public UserContext getInstance()
    {
        if(instance == null) {
            instance = new UserContext();
        }
        return instance;
    }   
    // Getters and setters
}

所以现在,当用户浏览应用程序时,我创建了一堆活动,通过它们的生命周期,利用这些变量并完成。 (例如,在onStart() 方法中,我在呈现活动之前检查用户是否已登录)。

我的问题是,Android 文档似乎建议我在我的 onPause() 方法中备份任何与上下文相关的数据。但是onPause() 也会在我自己创建一个新活动时被调用,并且备份所有 GlobalVariables 似乎很浪费,只是在下一个活动的onStart() 方法中恢复它们。有没有办法确定整个应用程序是否已经进入后台?如果没有,你什么时候真正保存你所有的 Globals?

谢谢,
泰迦。

【问题讨论】:

    标签: android activity-lifecycle


    【解决方案1】:

    无论是由用户还是由应用程序代码确定首选项值时,我都会保存首选项(使用 SharedPreferences.Editor.commit())。我还没有遇到过将保存偏好延迟到确定有意义之后的某个时间的情况。

    【讨论】:

    • 我也倾向于同意这一点,尽管我有经验更新一些东西会导致速度有点慢。
    • 啊。那么这可能是我还没有遇到过的一个场景,它确实提出了不同的解决方案。是什么导致了减速?是否同时保留了许多值?是否有成百上千的保存值?
    • 数百个是的,数千个没有。在发现 SQLite 数据库对于存储长列表更有意义之前,我应该更进一步说明这一点。对于一般设置... SharedPreferences 最有意义。
    【解决方案2】:

    我认为每个应用程序的情况都会有所不同。如果您需要保存该活动的状态,onPause() 并不是一个可恶的想法。如果用户移动到您自己的另一个活动然后点击主页按钮怎么办?您的应用程序将通过 onStop() 转换为停止状态。如果他们重新启动您的应用程序,则有合理的预期(也许)会保留以前的状态。

    当保存它们有意义时,我会保存它们。例如,我有一个 SMS 应用程序,我让用户在其中保存最后发送的消息。单击发送时,我保存了他们的最后一条消息。我什么都不做 onPause() 或 onStop(),但是当用户期望它完成时,我会完成所有事情。

    开发人员传统上讨厌 if 逻辑,但一位聪明的朋友总是提醒我,“if 逻辑在用户的脑海中”。如果我这样做,那么这将发生......在我的情况下;如果我发送消息,我的消息将被保存。

    【讨论】:

      【解决方案3】:

      唯一一次调用 onPause() 并且不调用 onStop()...是如果您的活动在另一个仅部分遮挡它的活动下仍然可见。大多数时候,onStop() 也会被调用,如果你知道在你自己的活动结构中,你总是会完全遮蔽彼此的活动,我会考虑保存在 onStop() 中并在 onStart() 中恢复。

      还请记住,一般来说,您在 onPause() 中保存的任何内容都应该在 onResume() 中恢复。保存在 onStop() 中的内容可能应该在 onStart() 中恢复。如果 onPause() 发生但 onStop() 没有... onStart() 将不会被调用。

      我还应该补充一点,我同意 Bill Mote 的说法,即你应该在有意义的时候保存东西。一旦您对 Activity Lifecycle 框架有了深入的了解,您通常可以做出不错的选择。

      【讨论】:

      • 嗯,在考虑 iOS 世界中的“活动”而不是“应用程序”时遇到了麻烦。
      • 不幸的是,我对 iOS 不熟悉......但考虑它的方式是一个应用程序,包括您在包中创建的所有活动。通常,尽管并非总是如此,但您将拥有在清单中声明为主要启动点的活动之一(您将在该活动的 中看到这一点)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      相关资源
      最近更新 更多