在 类 之间传递上下文引用的正确方法是什么?

What is the correct way of passing context reference between classes?

在我的应用程序中,我在不同的地方引用上下文,包括 Intents、访问资源、文件操作、AlertDialog 等。而且很难跨不同的 classes 传递当前上下文。因此,我尝试在启动器 activity 的单例 class 中设置应用程序基础上下文。因此,在启动应用程序时,我获取了应用程序上下文并将其设置在 class 中。稍后我指的是该上下文的相同实例。但是在 AlertDialog 等某些地方,如果我使用基本上下文,它会出错。那么,将上下文保存在一个共同的地方并访问它而不是在不同的 classes 之间传递当前上下文是一个好习惯吗?或者在不同 class 之间通信时传递上下文的首选方式是什么?

这是我的 class 用于获取上下文

public class AppContext extends Application {
    private static Context sContext = null;
   @Override
    public void onCreate() {
        super.onCreate();
        sContext = getApplicationContext();
    }

    public static Context getContext() {
        return sContext;
    }
}

But in some places like AlertDialog it gives error if I am using base context

您不能显示来自应用程序上下文的对话框。您只能使用 Activity 上下文来做到这一点。

So , is it a good practice to keep the context in a common place and accessing same instead of passing current context among different classes?

这取决于上下文的类型。如果这是一个应用程序上下文,如果你真的想的话,你可以将它存储在一个单例中。如果它是一个 Activity 上下文,你应该通过引用传递它,并且在将这个引用存储在某个地方时要小心以避免内存泄漏。

Or what is the preffered way of passing context while communicating among different classes?

可以把Context作为参数传过去。只要安全,就可以存储对此 Context 的引用。

例如,启动一个 AsyncTask 并从那里保存对 Activity 上下文的引用是不安全的,因为 AsyncTask 有自己的生命周期,它会阻止 Activity 在屏幕旋转时被垃圾收集。这将导致内存泄漏。在这种情况下,最好有一个 WeakReference 到 activity 的上下文。

因此,我的观点是,您可以将上下文作为参数传递到任何需要的地方。如果您想保留对上下文的引用 - 请小心。

您可以只创建一个 setter 方法,该方法接受 Context 作为参数,然后在所需的 class 中为其上下文插入 this

从那里开始,您应该能够使用那个 Context,无论您在什么地方 class,因为您将它存储为一个变量。

如果您不想那样做,您也可以这样做:

public static Context contextA;

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

两者都应该可以正常工作。