它是安全的应用程序上下文保存到Android的一个静态变量?(Is it safe to save

2019-06-23 19:57发布

我知道,在Android静态变量的使用是相当危险的,特别是如果你他们参考的活动。 但是,如果我有一个扩展应用类(我们称之为类“APP”),是安全的参照这个类的实例?

如果是这样,它也是安全的任何其他类有什么样的参考应用程序上下文? 我的意思是,能有内存泄漏,如果我有任何种类的类的应用程序上下文的参照?

其目的是,无论在哪个范围我在,我总是可以得到的应用程序上下文的引用。 我认为它是安全的,因为如果系统关闭应用程序,静态变量也消失了,直到应用程序再次下次启动时,这将重新初始化静态变量。

而且,这不是问题。但是,如果我使用多个进程,我会在每个进程App类完全不同的参考?

作为代码的一个例子,这里就是我想:

public class App extends Application
{
    private static Context _appContext;

    @Override
    public void onCreate()
    {
        super.onCreate();
        _appContext = this;
    }

    public static Context getAppContext()
    {
        return _appContext;
    }
}

Answer 1:

是安全的应用程序上下文保存到一个静态变量?

目前,是的,它似乎是安全的,但我不会有getAppContext()返回Context ,而是返回AppApplication

话虽这么说,但事实上,Android核心团队并没有设置它,这样在第一时间表明,也许有可能隐藏的问题,而我们不知道,或者说在将来这种方法可能会带来问题。

俗话说的缩写推移, 情况因人而异 。 :-)


编辑

如果是这样,它也是安全的任何其他类有什么样的参考应用程序上下文?

我不知道你所说的“安全”在这里的意思。

但是,如果使用多个进程,我将获得每个进程App类完全不同的引用,对不对?

如果使用多个进程,你应该用鳟鱼被掌掴。 但是,是的,你应该得到不同的App每个进程的实例。



Answer 2:

它应该是安全的。 还从下面的注释API文档可能是与你有关的:

通常没有必要的子类Application 。 在大多数情况下,静态的单身人士可以提供更模块化的方式相同的功能。 如果你单身,需要一个全球范围内(例如注册广播接收机),该函数来检索它可以给内部使用上下文Context.getApplicationContext()时,首先构建了单。



Answer 3:

它是安全的,为此在Application#onCreate()因为Application在任何活动之前创建的。 如果您的应用程序获取后台被杀, Application实例将被重新创建任何活动之前运行全局将被设置。

需要注意的是,你不应该从活动设置全局变量是很重要的。 如果你这样做,你的应用程序可能无法通过以下方式:

  1. 坐落在活动的全局
  2. 导航到活动B
  3. 应用程序进入后台
  4. 框架杀死的应用程序和过程
  5. 应用程序恢复
  6. 框架会在堆栈中的活动B. 活动不创建,直到您导航回给他们,所以全球没有设置!
  7. 活动B尝试使用全球性的,咚...... NullPointerException


Answer 4:

有趣的评论来自Studio弹出,当我整理讨厌的静态背景:

“这是一个泄漏(也打破了即时运行)。”

因此,推出即时运行的,我们在那里的Android开发者并没有对储蓄静态变量规划的情况。 虽然即时运行是(还)没有在我的日程,它是有用的知道,有一个具体的例子,其中它不仅是不好的做法,但使用情况下这是错误的标识。



Answer 5:

这是当你创建一个警告Context context; 在Android的工作室:

不要放置在静态字段中Android的上下文类; 这是一个内存泄漏和也打破即时运行。

静态字段会泄漏上下文。

非静态内部类都有自己的外部类的隐式引用。

如果该外部类是例如片段或活性,则该引用意味着,长期运行的处理程序/装载器/任务将保持到其阻止它得到垃圾收集活性的参考。 同样,这些较长的运行实例的活动和片段直接场引用可能导致泄漏。

视图模型类不应该指向的意见或非应用程序环境。



文章来源: Is it safe to save the app context to a static variable in Android?