Android: Это хорошая практика, чтобы получить контекст статически?

В настоящее время в моем приложении у меня есть следующий класс:

public class MyApp extends Application {

    private static Context context;

    public void onCreate(){
        super.onCreate();
        MyApp.context = getApplicationContext();
    }

    public static Context getContext() {
        return MyApp.context;
    }
}

Я использую это, чтобы иметь контекст в классах, которые не являются ни действиями, ни фрагментами. Там какая-либо разница между использованием контекста, хранящегося в этом классе, и использованием и деятельностью в качестве контекста? Хорошая практика заключается в том, чтобы этот класс или я должен предоставлять деятельность как контекст любому классу, который в нем нуждается?

Спасибо.

Ответ 1

Есть ли какая-либо разница между использованием контекста, хранящегося в этом классе, и использованием и активностью в качестве контекста?

Да. Прочитайте эпическое сообщение в блоге Dave Smith. В итоге: используйте Application, когда знаете , почему Application - правильный ответ... и это редко бывает.

Хорошо, что этот класс

ИМХО, не обычно. Иногда вам может понадобиться объект Application, но вам не нужен собственный пользовательский подкласс, и вам не нужно делать его одиночным.

должен ли я предоставлять действие как контекст любому классу, который нуждается в нем?

Вы предоставляете правильный экземпляр Context для любого метода, который ему нужен. Как описывает Дэйв Смит в этом сообщении в блоге, не все экземпляры Context создаются равными. Используйте Application только тогда, когда Application - это правильный тип Context.

Ответ 2

Да, это прекрасно. Наличие статической ссылки на приложение Context не вызовет утечки памяти. Этот Context существует, пока процесс жив.

Ответ 3

Если вам нужно это сделать, я думаю, вам нужно переосмыслить свой дизайн. Вам не нужно использовать контекст (что я могу думать) за пределами Activity, Fragment, Service и т.д. Все должно основываться на базовых компонентах приложения, и вы должны иметь возможность соответствующим образом передавать Context без необходимости делать это. Например, вы можете вызвать getContext() из Views, чтобы захватить его. Если вам нужно использовать его в POJO, он должен быть привязан к компоненту приложения и передать его через конструктор.

edit: Кажется, что с проблемой утечки памяти может возникнуть проблема? Я помню, как читал об изменениях ориентации экрана, разрушающих хаос, когда кто-то это делал. В любом случае, это не имеет большого смысла с точки зрения дизайна для меня.

edit2: Ребята, вы правы. Я неправильно помнил статью блога Романа об этом.