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

Dmi*_*try 35 java singleton android android-context baseadapter

在我的android项目中,我有ImageAdapter类,我在其中传递应用程序上下文以满足其他需求.

public class ImageAdapter extends BaseAdapter {
    private Context c;

    public ImageAdapter(Context c) {
            this.c = c;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是我想让ImageAdapter成为一个单例,以便从我的所有活动中轻松访问这个类的实例.但是我不知道如何将getApplicationContext()方法中的app context从我的一个活动传递给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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

也许你有一些其他的想法,可以为我的任何活动分享ImageAdapter.我是android的新手,我对在活动中传递数据的方式有点困惑.

我将不胜感激任何帮助.

moh*_*omn 85

更新:06年3月6日

使用MyApplication实例而不是Context实例.Applicationinstance是一个单例上下文实例本身.

public class MyApplication extends Application {

    private static MyApplication mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
    }

    public static MyApplication getContext() {
        return mContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

上一个答案

您可以像这样获取应用程序上下文:

public class MyApplication extends Application {

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getContext() {
        return mContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

<application
    android:name=".MyApplication"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
Run Code Online (Sandbox Code Playgroud)

  • 不建议将Android上下文类放在静态字段中.静态字段将泄露上下文 - Android Studio也会警告此问题. (7认同)
  • 这个答案是否仍然是最新的?因为编译器说"不要将Android上下文类放在静态字段中;这是内存泄漏(并且还会中断Instant Run) (6认同)
  • 顺便说一句,Application*是*应用程序上下文; `getApplicationContext()`可以用`this`代替.(`getApplicationContext`存在,以便如果你有*any*context就可以访问应用程序.)代码没有问题,只是指出了这一点. (4认同)
  • @JimClermonts我知道自您提出问题以来,答案已经更新,但是更新后的答案不应发出任何警告。不同之处在于“上下文”可以是任何上下文,包括活动(有时会被销毁)。通过指定它为“ Application”对象(该应用程序一直存在),应该不会有任何问题 (2认同)

Mic*_*cik 7

我宁愿将一个上下文实例作为参数传递给单身实际需要它的每个方法