将应用程序上下文保存到Android中的静态变量安全吗?

将应用程序上下文保存到Android中的静态变量安全吗?,android,process,static,android-context,Android,Process,Static,Android Context,我知道在Android上使用静态变量是相当危险的,特别是当你将它们引用到活动时。然而,如果我有一个扩展应用程序的类(让我们称这个类为“App”),那么引用这个类的实例安全吗 如果是这样,任何其他类对应用程序上下文进行任何类型的引用是否也安全?我的意思是,如果我在任何类型的类中引用了应用程序上下文,是否会出现内存泄漏 这样做的目的是,无论我在哪个范围内,我都可以获得对应用程序上下文的引用。我认为这是安全的,因为如果系统关闭应用程序,静态变量也会消失,直到下一次应用程序再次启动,这将再次初始化静态变

我知道在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;
    }
}
将应用程序上下文保存到静态变量是否安全

目前,是的,它看起来是安全的,尽管我不会让
getAppContext()
返回
Context
,而是返回
App
应用程序

话虽如此,Android核心团队一开始并没有这样设置的事实表明,可能存在我们不知道的隐藏问题,或者在未来这种方法可能会带来问题

正如谚语的首字母缩略词所说,.:-)


编辑

如果是这样,任何其他类对应用程序上下文进行任何类型的引用是否也安全

我不知道你说的“安全”是什么意思

但如果我使用多个进程,我会在每个进程上获得对App类的完全不同的引用,对吗


如果你使用多个过程,你应该被一条鳟鱼拍打。但是,是的,每个进程都应该有不同的
App
实例。

应该是安全的。此外,来自的以下注释可能与您相关:

通常不需要对
应用程序
进行子类化。在大多数情况下, 静态单例可以以更模块化的方式提供相同的功能 对。如果您的单身汉需要全局上下文(例如注册 广播接收器),检索它的函数可以给定 内部使用
Context.getApplicationContext()的上下文
首先构造单例


应用程序#onCreate()
中执行此操作是安全的,因为
应用程序是在任何活动之前创建的。如果您的应用程序在后台被杀死,则将重新创建
应用程序
实例,并在任何活动运行之前设置您的全局设置

重要的是要注意,您不应该从活动中设置全局变量。如果您这样做,您的应用程序可能会以以下方式失败:

  • 在活动A中设置全局
  • 导航到活动B
  • 应用程序进入后台
  • 框架杀死应用程序和进程
  • 应用程序已还原
  • 框架创建活动B。在您导航回backbackback中的活动之前,不会创建它们,因此不会设置全局
  • 活动B尝试使用全局和boom<代码>空点异常

  • 当我整理糟糕的静态环境时,工作室里突然出现了一条有趣的评论:

    “这是一个漏洞(也会破坏即时运行)。”


    因此,随着Instant Run的推出,Android开发者不打算保存静态变量。虽然即时运行(instant run)(尚未)出现在我的日程上,但知道有一个具体的例子是很有用的,在这个例子中,即时运行不仅是不好的做法,而且还识别出了错误的用例。

    这是创建
    上下文时的警告在android studio中:

    不要将Android上下文类放在静态字段中;这是一个 内存泄漏,也会中断即时运行

    静态字段将泄漏上下文

    非静态内部类具有对其外部类的隐式引用 班级

    例如,如果外部类是一个片段或活动,那么 引用意味着长时间运行的处理程序/加载程序/任务将持有 对防止其获取垃圾的活动的引用 收集。类似地,直接在字段中引用活动和 这些较长时间运行的实例的碎片可能会导致泄漏

    ViewModel类不应指向视图或非应用程序 上下文


    那么,你能想出什么办法来解决可能出现的问题吗?我应该使用WeakReference而不是硬引用吗?另外,请试着回答其余的问题。@androiddeveloper:“你能想出任何解决可能问题的方法吗?”--因为我们不知道可能的问题是什么,所以不可能为它们设计解决方案。我不久前也考虑过你的方法,因为每次传递上下文都不舒服。。。我想你应该从你的主要活动中初始化这个静态变量,对吗?你不必这么做。您可以将清单设置为将应用程序类设置为扩展应用程序的类,如下所示:@commonware您仍然认为这是合适的/有效的/好的答案吗?是的。安卓系统中静态变量的工作方式真的很奇怪吗?例如,如果应用程序使用太多内存,一些类将被卸载,因此如果它们包含静态变量,它们也将被删除?@Nate,请参考任何谷歌网站上说它是这样工作的。有些开发人员声称它是这样工作的,有些人说它不是这样(比如用户公用软件)。所以这是一个非常令人困惑的话题。@androiddeveloper,我不是从网站上得到这个的。我通过在真实设备上测试得到了这些信息,这是一个更强的参考t