Контекст приложения для SharedPreferences? - PullRequest
19 голосов
/ 02 февраля 2012

Могу ли я использовать ApplicationContext для работы с SharedPreferences и запуска, например, RemoteService?

Логически я думаю, что могу.Есть ли нюансы в таком подходе?

Ответы [ 3 ]

13 голосов
/ 27 декабря 2012

Гуннар Карлссон упомянул, что использование ContextWrapper getApplicationContext () совершенно очевидно, что вы должны использовать только Activity или Service Контекст до регистрация / отмена регистрации Приемник, привязывайте / отменяйте привязку ваших услуг (, если только в действительности не требуется регистрация со статическими данными, а не с конкретным компонентом ), чтобы избежать неопределенных утечек памяти и быть в безопасности, даже если вы иногда забываете отменить регистрацию системы очистит его для вас с предупреждениями.

Но для getSharedPreferences(...) вы всегда можете использовать любой ApplicationContext или Context без заминки. причина в том, что это было четко упомянуто

Для любого конкретного набора предпочтений (здесь SharedPreferences ) существует один экземпляр этот класс, которым делятся все клиенты .

Получение только ссылки через контекст приложения не сохранит ссылку навсегда. Это просто ссылка на настройки через контекст приложения, как и любой другой. Так что он будет очищен, как только пользователь закончит с ним.

Обратите внимание, что регистрация получателя через контекст приложения будет поддерживаться как глобальное состояние, связанное с вашим приложением. Так что он никогда не будет очищен для вас.

Пожалуйста, кто-нибудь поправит меня, если я ошибаюсь.

Надеюсь, это поможет вам.

10 голосов
/ 24 декабря 2012

Вы должны использовать Activity или Service Context, то есть 'this', если у вас нет явных и веских причин не делать этого.Используйте ApplicationContext только в том случае, если вам явно нужна ссылка на глобальное состояние вашего приложения.

Из документов API для разработчиков Android на ContextWrapper's getApplicationContext() метод:

Обычно это следует использовать только в том случае, если вам нужен контекст, жизненный цикл которого отделен от текущего контекста, который связан с временем жизни процесса, а не с текущим компонентом.

и

использование ApplicationContext (...) [в отличие, например, от контекста действия или службы] может легко привести к серьезным утечкам, если вы забудете отменить регистрацию, отменить привязку и т. Д.

Например, чтобы извлечь SharedPreferences в Activity, например, для изменения данных, отображаемых для пользователя, используйте this.getSharedPreferences(...), поскольку нет четкой причины, по которой вам нужно было бы задействовать жизненный цикл приложения.То же самое, в Service, используйте this.getSharedPreferences(...).(Обратите внимание, что Activity и Service являются контекстами. Они косвенно расширяют android.content.Context)

CommonsWare написал подробный ответ: Когда вызывать контекст действия ИЛИ контекст приложения? , где он объясняет, что вызывает getApplicationContext () "is almost always wrong" и описывает несколько исключений, когда его использовать:

  • привязка к Сервису из Деятельности.
  • что-то нужнобыть привязанным к контексту с глобальной областью действия.

CommonsWare также ссылается на ответ инженера Android Framework Дайан Хэкборн:

Первое правилоЯ бы сказал вам: если вы не знаете, зачем вам нужен [Application Context], он вам, вероятно, не нужен (...) Единственный раз, когда вы хотите использовать getApplicationContext (), это когда вам нужен Context, который существует внежизненного цикла класса Activity (или другого компонента).

Дополнительные ответы на ту же тему с обсуждением вопросов, касающихся ApplicationContext:

1 голос
/ 24 декабря 2012

Да, вы можете использовать getApplicationContext() для этого. Вы можете использовать getApplicationContext() везде, где используете ключевое слово getBaseContext() или this, когда находитесь в деятельности или службе, за исключением очень специфических случаев, например, при добавлении представлений или диалогов в пользовательский интерфейс.

Здесь - отличная статья о том, что такое Контекст и что делает, и которую я определенно рекомендую пройти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...