83

我真的不明白整个事情是如何运作的,所以如果我有一些类A需要B扩展类的上下文Activity,我如何获得该上下文?

我正在寻找一种比将上下文作为参数提供给类A构造函数更有效的方法。例如,如果类A将有数百万个实例,那么我们最终将拥有数百万个冗余指针,Context而我们应该能够以某种方式在某个地方只有一个和一个 getter 函数......

4

7 回答 7

59

好的,我将举一个小例子说明如何按照您的要求进行操作

public class ClassB extends Activity
{

 ClassA A1 = new ClassA(this); // for activity context

 ClassA A2 = new ClassA(getApplicationContext());  // for application context. 

}
于 2012-09-07T15:24:09.057 回答
45

您可以使用Application类(android.application 包中的公共类),即:

需要维护全局应用程序状态的基类。您可以通过在 AndroidManifest.xml 的标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的进程时为您实例化该类。

要使用此类,请执行以下操作:

public class App extends Application {

    private static Context mContext;

    public static Context getContext() {
        return mContext;
    }

    public static void setContext(Context mContext) {
        this.mContext = mContext;
    }

    ...

}

在您的清单中:

<application
        android:icon="..."
        android:label="..."
        android:name="com.example.yourmainpackagename.App" >
                       class that extends Application ^^^

在活动 B 中:

public class B extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sampleactivitylayout);

        App.setContext(this);
                  ...
        }
...
}

A类:

Context c = App.getContext();

注意

通常不需要子类化 Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),则可以为检索它的函数提供一个 Context,该上下文在首次构建单例时在内部使用 Context.getApplicationContext()。

于 2012-09-07T15:45:24.363 回答
37

获取活动上下文的最佳且简单的方法是放在.this活动名称之后。例如:如果您的 Activity 的名称是SecondActivity,它的上下文将是SecondActivity.this

于 2016-10-22T15:09:58.153 回答
3

您将上下文传递给 B 类的构造函数,并确保传递 getApplicationContext() 而不是 activityContext()

于 2012-09-07T15:13:51.293 回答
2

您可以使用类 A 的参数 Context 创建构造函数,然后可以使用此上下文。

上下文 c;

A(上下文上下文){ this.c=context }

从 B 活动中,您使用此构造函数并传递 getApplicationContext() 创建 A 类对象。

于 2012-09-07T15:25:18.407 回答
1

如果您需要 B 中 A 的上下文,则需要将其传递给 B,您可以按照其他人的建议通过将 Activity A 作为参数传递来做到这一点。我看不出有很多 A 的实例有自己的指向 B 的指针的问题,不确定这是否会是那么大的开销。

但是,如果这是问题所在,则一种可能性是将指向 A 的指针保留为类的一种全局变量Application,正如@hasanghaforian 所建议的那样。实际上,根据您需要上下文的用途,您甚至可以使用 the 的上下文Application

我建议阅读这篇关于上下文的文章,以更好地弄清楚你需要什么上下文。

于 2013-10-09T11:31:43.147 回答
1

在 Kotlin 中将是:

activity?.applicationContext?.let {
         it//<- you context
        }
于 2018-05-08T12:22:08.180 回答