从非活动单例类获取应用程序上下文

在我的Android项目中,我有ImageAdapter类,其中我传递应用程序上下文的一些进一步的需求。

public class ImageAdapter extends BaseAdapter { private Context c; public ImageAdapter(Context c) { this.c = c; } ... } 

问题是,我想让ImageAdapter作为singleton从我所有的活动中轻松访问这个类的实例。 但我不知道如何从应用程序上下文getApplicationContext()方法从我的活动之一传递给ImageAdapter。 那么有没有什么“魔法”来做到这一点呢?

 public class ImageAdapter extends BaseAdapter { private Context c; private static class Holder { public static final ImageAdapter IA = new ImageAdapter(); } private ImageAdapter() { this.c = /* some magic here */.getApplicationContext(); } public static ImageAdapter getInstance() { return Holder.IA; } ... } 

也许你有一些其他的想法共享ImageAdapter我的任何活动。 我是一个android的newby,我有点混淆在活动之间传递数据的方式。

我会很感激任何帮助。

Solutions Collecting From Web of "从非活动单例类获取应用程序上下文"

你可以像这样获得应用程序的上下文:

 public class MyApplication extends Application { private static Context mContext; @Override public void onCreate() { super.onCreate(); mContext = getApplicationContext(); } public static Context getContext() { return mContext; } } 

然后,可以从方法MyApplication.getContext()调用应用程序上下文

不要忘记在清单文件中声明应用程序:

 <application android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name" > 

我宁愿将一个上下文实例作为parameter passing给每个真正需要它的单例的方法

方法#1:

既然你指定ImageAdapter是一个单身人士,一个简单的答案是从一个有权访问应用程序上下文的类创build单身人士:

 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); ImageAdapter.createIt(this); } } public class ImageAdapter extends BaseAdapter { private static ImageAdapter it; // Get the singleton. public static ImageAdapter getIt() { return it; } // Call this once, to create the singleton. public static void createIt(Context context) { it = new ImageAdapter(context); } private final Context c; private ImageAdapter(Context context) { c = context; } } 

方法#2:

如果它不是一个单身人士,那么我会使用接受的答案。 在这种情况下,从ImageAdapter中删除本地variables,因为上下文总是可以从MyApplication获得。 扩大接受的答案,如果你想要一个本地方法作为一个方便,定义ImageAdapter.getContext()。 完整解决scheme

 public class MyApplication extends Application { private static Context appContext; public static Context getContext() { return appContext; } @Override public void onCreate() { super.onCreate(); appContext = this; } } public class ImageAdapter extends BaseAdapter { public ImageAdapter() { } // [Optional] Call this whenever you want the app context. private Context getContext() { return MyApplication.getContext(); } }