如何从非活动类中检索上下文?

我find了一个答案 ,似乎说我应该创build一个单独的类,并创build一个静态的MyApplication对象,并作出一个get方法。 然后任何类都可以调用MyApplication.get()来获取上下文。

还有其他更清洁的方法吗? 这是我的情况:

我有一个类A和一个类B.类A包含一个类B的对象(让我们称之为对象b)。 在类AI调用,“b.play()”。 但是,我得到一个空指针exception,因为类B需要传递一个上下文到MediaPlayer.create()方法。

到目前为止,我把一个黑客和AI的类叫做“b.play(this)”,只是简单地把这个上下文传递给B.然而这非常丑陋,看起来像是一个糟糕的OOP使用。

有什么想法吗?

Solutions Collecting From Web of "如何从非活动类中检索上下文?"

如果B类需要一个Context来操作,那么我没有看到有类A提供给它的任何问题(通过play方法上的参数,构造函数中的参数等)。

我不认为你正在做任何可怜的面向对象提供B类依赖,它需要做它的工作。

这个问题在Android开发中似乎出现了很多。 获取对特定上下文的引用的一个解决scheme是对应用程序进行子类化,并获取您想要的上下文的引用。

public class MyApplication extends Application { private Context context; @Override public onCreate() { super.onCreate(); this.context = getApplicationContext() // Grab the Context you want. } public static Context getApplicationContext() { return this.context; } } 

然而,这个解决scheme要求你在清单中指定你的子类的名字。

 <application android:name=".MyApplication" </application> 

然后你就可以在你的应用程序的任何地方使用这个非活动类。

 MyApplication.getContext(); // Do something with the context! :) 

传递this是一种可行的做事方式,特别是如果this是创build需要Context的对象的活动。 有时,我会把上下文放到构造函数中(比如public MyObject(Context context){this.context = context;} ),这样就不需要每次都发送它。 但是,如果您的对象是在多个“活动”中共享的,则可能应该使用新的“活动”更新正在查看的上下文,尽pipe如果您使用旧的活动,我还没有testing过会发生什么情况。

我也在这里回答。

您可以使用ContextWrapper来完成此操作, 如此处所述。

例如:

 public class MyContextWrapper extends ContextWrapper { public MyContextWrapper(Context base) { super(base); } public void someMethod() { // MediaPlayer.create(this, ...) } }