我有一堆用户首选项保存在我的应用程序中的单个对象中。样本模型如下所示 -
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()
方法中备份任何与上下文相关的数据。但是每次我自己创建一个新的Activity时,onPause()
也会被调用,将所有GlobalVariables备份起来似乎是浪费,只是为了在下一个活动的onStart()
方法中恢复它们。有没有办法确定整个应用程序是否已进入后台?如果没有,你什么时候实际保存所有Globals?
谢谢,
的Teja。
答案 0 :(得分:1)
我认为每个应用程序的情况都会有所不同。如果你需要保存该活动的状态,onPause()不是一个可恶的想法。如果用户移动到您自己的另一个活动然后点击主页按钮怎么办?您的应用程序将通过onStop()转换为已停止。如果他们重新启动您的申请,则可以合理地预期(可能)保留之前的州。
我保存它们是有意义的。例如,我有一个SMS应用程序,我让用户保存最后发送的消息。点击发送时我保存了他们的最后一条消息。我什么都没做onPause()或onStop(),但是当用户期望它完成时我就完成了所有工作。
开发人员传统上讨厌if-logic,但一位明智的朋友总是提醒我,“如果逻辑在于用户的想法。”如果我这样做,那么这将发生......在我的情况下;如果我发送消息,我的消息将被保存。
答案 1 :(得分:1)
我在确定首选项值时保存首选项(使用SharedPreferences.Editor.commit()),无论是由用户还是应用程序代码。我还没有遇到过将延迟保存偏好推迟到确定有意义之后的某个时刻的情况。
答案 2 :(得分:0)
调用onPause()的唯一时间并且不调用onStop()...如果您的活动实际上仍然在另一个仅部分遮盖它的活动下可见。大多数时候,onStop()也会被调用,如果你在自己的活动结构中知道你将永远完全模糊对方的活动,我会考虑保存在onStop()中并在onStart()中恢复。
还要记住,一般来说,你在onPause()中保存的内容应该在onResume()中恢复。 onStop()中保存的内容应该可以在onStart()中恢复。如果发生onPause()但onStop()没有... onStart()将不会被调用。
我还应该补充一点,我同意Bill Mote的说法,你应该在有意义的时候保存。一旦你对Activity Lifecycle框架有了深入的了解,你通常可以做出一个很好的选择。