如何获得我的活动上下文?
我真的不知道这个东西是如何工作的,所以如果我有一些需要扩展Activity
的类B
的上下文的类B
,我该如何获取上下文?
我正在寻找一种更有效的方法,然后将上下文作为parameter passing给A
类构造函数,因为如果A
类将有数百万个实例,那么我们最终会得到数百万个冗余指针,而我们应该能够以某种方式只有一个地方和一个吸气function…
你可以使用Application
类(公共类在android.application包中),即:
那些需要维护全局应用程序状态的基类。 你可以通过在你的AndroidManifest.xml的标签中指定它的名字来提供你自己的实现,当你的应用程序/包的进程被创build时,这个类将会被实例化。
要使用这个类做:
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。 在大多数情况下,静态单例可以以更模块化的方式提供相同的function。 如果你的单例需要一个全局上下文(例如注册广播接收者),那么检索它的函数可以被赋予一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext()。
好的,我将举一个小例子说明如何去做你所要求的
public class ClassB extends Activity { ClassA A1 = new ClassA(this); // for activity context ClassA A2 = new ClassA(getApplicationContext()); // for application context. }
获取活动上下文的最好和简单的方法是把.this
放在Activity的名字后面。 例如:如果你的Activity的名字是SecondActivity
,它的上下文将是SecondActivity.this
您将上下文传递给它的构造函数中的类B,并确保您传递getApplicationContext()而不是activityContext()
如果您需要B中的A的上下文,则需要将它传递给B,并且可以通过将Activity A作为parameter passing给其他人。 我没有看到有很多A的实例有自己的指针B的问题,不知道这是否甚至是一个开销。
但是,如果这是问题,就像@hasanghaforianbuild议的那样,把A的指针保持为Application
类的一个全局的,可变的types。 事实上,取决于你需要什么上下文,你甚至可以使用Application
的上下文来代替。
我build议阅读关于上下文的这篇文章 ,以便更好地弄清楚你需要什么上下文。
您可以使用类A的参数Context来创build构造函数,然后您可以使用此上下文。
上下文c;
A(Context context){this.c = context}
从B活动中,使用此构造函数创build类A的对象,并传递getApplicationContext()。