我真的不明白这整个事情是如何工作的,所以如果我有一些类A
需要扩展B
的类Activity
的上下文,我如何获得这种背景?
我正在寻找一种比将上下文作为类A
构造函数的参数更有效的方法。例如,如果类A
将有数百万个实例,那么我们最终将拥有数百万个指向Context
的冗余指针,而我们应该能够以某种方式只有一个地方和一个getter函数......
答案 0 :(得分:46)
好的,我将举例说明如何做你要求的事情
public class ClassB extends Activity
{
ClassA A1 = new ClassA(this); // for activity context
ClassA A2 = new ClassA(getApplicationContext()); // for application context.
}
答案 1 :(得分:35)
你可以使用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.getApplicationContext()的Context 首先构建单身人士。
答案 2 :(得分:27)
获取活动上下文的最简单方法是将.this
放在活动名称之后。例如:如果您的活动名称为SecondActivity
,则其上下文将为SecondActivity.this
答案 3 :(得分:2)
您将上下文传递给它的构造函数中的B类,并确保传递getApplicationContext()而不是activityContext()
答案 4 :(得分:1)
您可以使用A类参数Context创建构造函数,然后可以使用此上下文。
上下文c;
A(上下文上下文){ this.c =上下文 }
从B活动中,您使用此构造函数创建A类对象并传递getApplicationContext()。
答案 5 :(得分:1)
如果你需要B中A的上下文,你需要将它传递给B,你可以通过将Activity A作为参数传递给其他人建议。我没有看到很多A的实例都有自己的B指针的问题,不确定是否会产生这么大的开销。
但是,如果这就是问题,那么可能就是将指针A保持为Application
类的全局变量,如@hasanghaforian所建议的那样。实际上,根据您需要的上下文,您甚至可以使用Application
的上下文。
我建议您阅读有关上下文的this article,以便更好地了解您需要的上下文。
答案 6 :(得分:1)
在Kotlin将会:
activity?.applicationContext?.let {
it//<- you context
}