如何从任何地方获取上下文? [复制]

Posted

技术标签:

【中文标题】如何从任何地方获取上下文? [复制]【英文标题】:How to get the Context from anywhere? [duplicate] 【发布时间】:2012-03-15 18:47:59 【问题描述】:

android中,有没有什么办法以静态的方式获取应用程序的上下文?例如从后台线程中检索它。

谢谢

【问题讨论】:

一般来说,如果你调用一个需要它的方法,你应该通过一个参数传递一个上下文引用(但不要存储引用,它会导致内存泄漏) .在某些情况下,您还可以为此使用 Application-Object,请参阅this question。但请记住答案中描述的限制。 【参考方案1】:

最简单(也是正确)的方法是:

定义一个新类

public class MyApp extends Application 
    private static MyApp instance;

    public static MyApp getInstance() 
        return instance;
    

    public static Context getContext()
        return instance;
        // or return instance.getApplicationContext();
    

    @Override
    public void onCreate() 
        instance = this;
        super.onCreate();
    

然后在您的清单中,您需要将此类添加到“应用程序”选项卡的“名称”字段中。或者编辑xml并放

<application
    android:name="com.example.app.MyApp"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    .......
    <activity
        ......

然后从任何你可以打电话的地方

MyApp.getContext();

希望对你有帮助

【讨论】:

这会起作用,但要小心使用任何你不会滥用它的单例。阅读this question 的答案,解释为什么 ApplicationContext 很少(尽管有时)是正确的上下文使用.最佳方式:除非您只是在需要 Context 的类中公开一个将 Context 作为参数的公共方法(并从您的 Activity 等传递它),否则这是实现此目的的方法。 Exp: public void abc(Context c,int a);并从任何活动中调用它。【参考方案2】:

基本上,您有 2 种类型的上下文 - 活动上下文Application Context

没有必要对所有事情都只使用一个上下文。如果在每种需要上下文的情况下都使用一个上下文,则会出现问题。 最好遵循这样的做法 - 在 Activity 内部使用 Activity Context 并在传递超出 Activity 范围的上下文时使用 Application Context,这将帮助您避免 @ 987654322@.

如果您阅读本文,您可以看到这两个上下文之间的区别。

应用程序上下文只要你的应用程序还活着,就会一直存在 并且不依赖于活动生命周期。如果你打算 保留需要上下文的长寿命对象,记住 应用程序对象。

相反,Activity Context 与 Activity 相关联,并且可以在 Activity 被销毁时多次销毁 - 更改屏幕方向、后退按钮等。

【讨论】:

这是一个很好的答案。

以上是关于如何从任何地方获取上下文? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 StatelessWidget 的任何函数中获取上下文?

如何内部连接来自不同数据上下文的表? [复制]

在 ReactJS 的组件构造方法中获取上下文值的任何方法

将烧瓶请求/应用程序上下文复制到另一个进程

如何保存一个HTML FORM数据,以便将来使用。

如何保存一个HTML FORM数据,以便将来使用。