当由于配置更改而重新创建活动时,活动的静态成员会发生什么

时间:2016-07-13 06:22:24

标签: android android-activity static mvp

我想在Activity中创建一个静态presenter对象,这样当由于配置更改而重新创建Activity时,它将保留presenter实例,并且我的业务逻辑不会受到影响。

Activity的代码是:

    public class HomeActivity extends AppCompatActivity {

    public static HomePresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        if (presenter == null){
            presenter = new HomePresenter();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

静态实例不会发生任何事情。但是,如果不删除对静态演示者的引用,这样做可能会泄漏内存(请参阅Avoiding memory leaks)。

我会建议另一种方法。由于配置更改(例如,旋转),在onRetainNonConfigurationInstance()被销毁时覆盖Activity以保留对象。并且在配置更改后使用getLastNonConfigurationInstance()来获取完全相同的对象。

 public class HomeActivity extends AppCompatActivity {

    public HomePresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        presenter = (HomePresenter)getLastNonConfigurationInstance();
        if (presenter == null){
            presenter = new HomePresenter();
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        return presenter;
    }
}

您还可以使用Fragment在配置更改期间保持对象处于活动状态,请参阅RetainingAnObject

答案 1 :(得分:0)

你的代码会有效,主持人会活着,但是,请不要这样做。

关键字'static'表示该字段的值将附加到类,而不是它的实例。因此,如果您将拥有HomeActivity,那么您将转到SomeElseActivity,然后转到新的HomeActivity(您将拥有HomeActivity - > SomeElseActivity - > HomeActivity)用于新的HomeActivity,您将拥有与旧的HomeActivity相同的演示者。因此,您将拥有2个独立HomeActivity实例的共享演示者。此外,如果您在演示者中有某种状态,那么在这种情况下您的应用程序会遇到很多问题。

我建议您删除'static'关键字。如果您的演示者有状态,那么在配置更改期间需要保存,请尝试以下两种选择之一:

1)在演示者中创建onSaveInstanceState和onRestoreInstance状态,并使用适当的活动方法调用它们

2)创建没有ui的片段,但是使用标记'retain instace'(setRetainInstance方法),这个片段将继续引用你的演示者。

答案 2 :(得分:0)

  

简而言之,静态对象仍然存在,当你的类被加载到内存中时它就会诞生,并且在你的应用程序死掉或卸载类之前永远不会消失。

在JVM语言中,编译器通过嵌入 字节码中的值来优化静态字段,而不是在运行时计算值。

当你第一次启动JVM并加载一个类时(这是由类加载器在以任何方式首次引用类时完成的)任何静态块或字段'loaded'进入JVM并变得可访问。

enter image description here

  

因此,静态变量存在于快照中的圆圈中,并且它不知道任何配置更改,无论发生什么,只要在类加载时它就在那里。