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

时间:2011-07-28 23:41:14

标签: java android android-context

我发现one answer似乎说我应该创建一个单独的类并创建一个静态MyApplication对象并创建一个get方法。然后任何类都可以调用MyApplication.get()来检索上下文。

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

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

到现在为止,我把一个黑客和A类混在一起,我打电话给了......“b.play(this)”并简单地将上下文传递给了B.然而,这很丑陋,看起来像是对OOP的错误使用。

有什么想法?

4 个答案:

答案 0 :(得分:11)

这个问题似乎在Android开发中出现了很多。获取对特定Context的引用的一种解决方案是继承Application并获取对所需Context的引用。

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; }
}

但是,此解决方案要求您在清单中指定子类的名称。

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

然后,您可以在非活动类中使用此应用程序中的任何位置。

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

答案 1 :(得分:8)

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

我认为你没有做任何可怜的OOP,因为它为B类提供了做它的工作所需的依赖。

答案 2 :(得分:1)

传递this是一种可行的方法,特别是如果this是创建需要Context的对象的活动。有时,我会将Context放入构造函数(如public MyObject(Context context){this.context = context;}),这样您就不需要每次都发送它。但是,如果您的对象在多个活动中共享,您可能应该使用新活动更新它正在查看的上下文,但我还没有测试使用旧活动时会发生什么。

答案 3 :(得分:1)

我也回答了here

您可以使用ContextWrapperas described here.

执行此操作

例如:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

   public void someMethod() {
      // MediaPlayer.create(this, ...)
   }

}