Android:应用程序上下文 class

Android: ApplicationContext class

我的应用程序使用多个助手 classes 和需要上下文的静态方法,为此我创建了一个 "ApplicationContext" class 如下:

import android.app.Activity;
import android.content.Context;

public class ApplicationContext {

    private Context appContext;
    private static ApplicationContext instance;

    private ApplicationContext(){}

    public void init(Context context)
    {
        appContext = context;
    }

    private Context getContext()
    {
        return appContext;
    }

    public static Context get()
    {
        return getInstance().getContext();
    }

    public static Activity getActivity()
    {
        return (Activity)getInstance().getContext();
    }

    public static Context getApplicationContext() 
    {
        return get().getApplicationContext();
    }

    public static ApplicationContext getInstance()
    {
        return instance == null ? instance = new ApplicationContext(): instance;
    }
}

并且在每个 activity onCreate 方法中,我将当前上下文设置如下:

ApplicationContext.getInstance().init(this);

有了这个,我可以在任何需要的地方获取当前上下文或 activity 的实例,如下所示:

ApplicationContext.get();
ApplicationContext.getActivity();

一切正常,但我不确定这是否是一种好的做法。

另一种选择是声明一个静态上下文,如下所示:

public WeakReference<Context> context;

in -non activity- classes 在我需要的地方,将它设置在使用 classes 的活动中,如下所示:

whateverclassname.context = this;

并像

一样访问它
if (context!=null) ... context.get()

首先,我想知道第一种方法是否是好的做法,然后,如果不是,我想知道这两者中哪一个最好,或者关于如何处理需求的任何建议非activity classes.

中的上下文

据我所知,静态弱引用是一种很好的做法。

我建议你关注我的 this answer

不要这样做!上下文基本上有两个级别:一个是应用程序上下文,您可以在您的 Activity 中获取或子 classing 应用程序 class 并在 manifest.xml 中提及它。另一个是 Activity 上下文,它一直存在,直到 activity 没有被销毁。

您必须使用应用程序上下文,您认为操作独立于您的 activity/fragment。您可以使用 Application sub-class 自由访问它,例如MyApplication.getInstance()(这里,MyApplication 扩展了 Application,getInstance() 提供了它的实例)

您必须使用 Activity 上下文,将 activity 实例直接传递给上下文引用变量,您认为操作必须在 Activity 范围内。将 activity 实例保存在另一个 class 的静态变量中将泄漏 Activity 对象。