Android活动生命周期问题:何时提交全局引用

Android活动生命周期问题:何时提交全局引用,android,activity-lifecycle,Android,Activity Lifecycle,在我的应用程序中,我有一堆保存在单例对象中的用户首选项。示例模型如下所示- public class UserContext { public static final String WEBSRV_IP = "TRIMMED"; public static UserContext instance; // Contains username, password, if they're valid etc. private LoginDataModel loginM

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

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
}
公共类用户上下文{
公共静态最终字符串WEBSRV_IP=“TRIMMED”;
公共静态用户上下文实例;
//包含用户名、密码、是否有效等。
私人LoginDataModel loginModel;
私有ArrayList模型;
私有过滤器数据模型过滤器;
私有用户上下文()
{
}
公共UserContext getInstance()
{
if(实例==null){
instance=newusercontext();
}
返回实例;
}   
//接球手和接球手
}
现在,当用户浏览应用程序时,我创建了一系列活动,这些活动贯穿其生命周期,利用这些变量并完成。(例如,在
onStart()
方法中,我在显示活动之前检查用户是否已登录)

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

谢谢,

Teja.

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

当拯救他们有意义时,我会拯救他们。例如,我有一个SMS应用程序,让用户保存最后发送的消息。我在单击“发送”时保存他们的最后一条消息。我在pause()或onStop()上什么都不做,但我在用户希望完成的时候完成了所有事情

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

唯一调用onPause()而不调用onStop()的时间。。。如果您的活动在另一个仅部分遮挡它的活动下方仍然可见。大多数时候,OnStor()也会被调用,如果你知道在你自己的活动结构中,你总是会完全模糊对方的活动,我会考虑保存在OnStutter()中,并恢复在OnStutter()中。

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


我还应该补充一点,我同意比尔·莫特的说法,即你应该在有意义的时候保存东西。一旦您对活动生命周期框架有了深入的了解,您通常可以做出一个很好的选择。

在确定首选项值时,无论是用户还是应用程序代码,我都会保存首选项(使用SharedReferences.Editor.commit())。我还没有遇到过这样的情况,即延迟保存首选项直到确定它们是合理的。

Hmm,在iOS世界中,思考“活动”而不是“应用程序”有困难。不幸的是,我不熟悉iOS。。。但我们可以这样认为,应用程序包含了您在包中创建的所有活动。一般来说,虽然不总是这样,但您将有一个在清单中声明为主要启动点的活动(您将在该活动的列表中看到这一点)。我也倾向于同意这一点,尽管我有过更新一些东西的经验,这会导致一些速度减慢。啊。那么这可能是一个我还没有遇到的场景,它确实提出了一个不同的解决方案。是什么导致了减速?是否同时保留了许多值?是否有成百上千的保存值?成百上千的是,成千的不是。我本应该再限定一点,直到发现SQLite数据库对于存储长列表更有意义之前。对于常规设置。。。共享引用最有意义。