我真的不明白整个事情是如何运作的,所以如果我有一些类A
需要B
扩展类的上下文Activity
,我如何获得该上下文?
我正在寻找一种比将上下文作为参数提供给类A
构造函数更有效的方法。例如,如果类A
将有数百万个实例,那么我们最终将拥有数百万个冗余指针,Context
而我们应该能够以某种方式在某个地方只有一个和一个 getter 函数......
我真的不明白整个事情是如何运作的,所以如果我有一些类A
需要B
扩展类的上下文Activity
,我如何获得该上下文?
我正在寻找一种比将上下文作为参数提供给类A
构造函数更有效的方法。例如,如果类A
将有数百万个实例,那么我们最终将拥有数百万个冗余指针,Context
而我们应该能够以某种方式在某个地方只有一个和一个 getter 函数......
好的,我将举一个小例子说明如何按照您的要求进行操作
public class ClassB extends Activity
{
ClassA A1 = new ClassA(this); // for activity context
ClassA A2 = new ClassA(getApplicationContext()); // for application context.
}
您可以使用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()。
获取活动上下文的最佳且简单的方法是放在.this
活动名称之后。例如:如果您的 Activity 的名称是SecondActivity
,它的上下文将是SecondActivity.this
您将上下文传递给 B 类的构造函数,并确保传递 getApplicationContext() 而不是 activityContext()
您可以使用类 A 的参数 Context 创建构造函数,然后可以使用此上下文。
上下文 c;
A(上下文上下文){ this.c=context }
从 B 活动中,您使用此构造函数并传递 getApplicationContext() 创建 A 类对象。
如果您需要 B 中 A 的上下文,则需要将其传递给 B,您可以按照其他人的建议通过将 Activity A 作为参数传递来做到这一点。我看不出有很多 A 的实例有自己的指向 B 的指针的问题,不确定这是否会是那么大的开销。
但是,如果这是问题所在,则一种可能性是将指向 A 的指针保留为类的一种全局变量Application
,正如@hasanghaforian 所建议的那样。实际上,根据您需要上下文的用途,您甚至可以使用 the 的上下文Application
。
我建议阅读这篇关于上下文的文章,以更好地弄清楚你需要什么上下文。
在 Kotlin 中将是:
activity?.applicationContext?.let {
it//<- you context
}