Java 这是保存对和活动/上下文的静态引用的有效方法吗?为什么不应该';我不能这样做吗?

Java 这是保存对和活动/上下文的静态引用的有效方法吗?为什么不应该';我不能这样做吗?,java,android,performance,android-activity,memory-leaks,Java,Android,Performance,Android Activity,Memory Leaks,我有一个抽象的BaseFragmentActivity类,我在android应用程序中的所有活动都扩展了这个类。在这个类中,我将当前运行的活动的静态引用维护为scurrenctivity。在我的onStart()生命周期回调中,我设置如下: public abstract class BaseFragmentActivity extends FragmentActivity { private static BaseFragmentActivity sCurrentActivity;

我有一个抽象的
BaseFragmentActivity
类,我在android应用程序中的所有活动都扩展了这个类。在这个类中,我将当前运行的活动的静态引用维护为
scurrenctivity
。在我的
onStart()
生命周期回调中,我设置如下:

public abstract class BaseFragmentActivity extends FragmentActivity { 

    private static BaseFragmentActivity sCurrentActivity;

    public static BaseFragmentActivity getCurrentActivity(){
        return sCurrentActivity;
    }

    @Override
    protected void onStart() {
        super.onStart();
        sCurrentActivity = this;
    }
使用此功能,我可以从代码中的任何位置通过调用以下命令获取当前活动/上下文:

BaseFragmentActivity.getCurrentActivity()

所以我读到的所有东西都说我不应该持有对活动/上下文的静态引用但如果此静态变量在所有活动中共享,那么我是否每次启动新活动时都会泄漏上下文? 我已经阅读了Romain Guy关于避免内存泄漏的帖子(),在android开发者频道上观看了关于泄漏视图(和)的性能模式视频,我有理由相信这是一种不好的做法。但是有人能帮我理解泄漏的确切原因吗?如果是的话。我想提出一个理由来消除这一点,但我需要一个比“我认为它泄露了一个背景”更有力的论点

编辑:
为了清楚起见,这是我继承的一个代码库,其中所有内容都是紧密耦合和混乱的,这个函数几乎可以在查找上下文对象的任何地方使用。内部对话框按钮回调以激发新意图,内部数组适配器,甚至(出于未知原因)内部片段以获取父活动内部的视图!我需要向我们的产品负责人证明,以他们能够理解的方式对新功能进行重构是合理的。

在给定的时间内,您最多泄漏一个活动实例。如果你加上

 @Override
    protected void onStop() {
        super.onStop();
        sCurrentActivity = null;
    }
那么你就不会泄露任何信息了

但我真的不明白你为什么要这么做,你想做什么

编辑:在您解释了您想要实现的目标之后,对我来说,扩展应用程序、保持对它的静态引用并从任何地方访问它似乎更合理,我认为这样做更好,原因有三:

  • 据我所知,只要你的应用程序正在运行,应用程序实例就会一直保持活动状态,有时甚至当它没有运行时,系统也不会发布它,这样它就可以为你的应用程序的下一次启动做好准备
  • 我打赌活动对象比应用程序对象有更多的内存开销
  • 当您的应用程序对象被终止时,我99%确信您的进程也会存在,因此静态引用不会导致泄漏
  • 一些代码示例:

    public class App extends Application {
        public static App context;
        public void onCreate() {
           super.onCreate();
           context = this;
        }
    }
    

    你已经看了视频,读了专家的博客,你仍然在问同样的问题:使用活动的引用是否不好?我可以这样做,但一旦新活动开始,它不会取代旧的引用并允许收集吗?是的,但同时呢?在呼叫onStop到下一个onStart之间,你有时间毫无理由地进行活动……不过,我认为,对你来说,更重要的是,你要学会解释你想要实现的目标,我们可以引导你找到更好的方法,当然,啊。谢谢我想基本上从代码库中删除这段代码,但由于它无处不在,这就要求进行更广泛的重构。我如何向非开发人员(我们的产品所有者)解释这是一种糟糕的做法,值得我花时间重构、重新构建和修复构建新的用户功能。我将留给您处理:)