2012-02-02 3 views
18

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

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

+3

Что не так с этим вопросом? Это слишком манекен? – user1074896

+0

Думайте, что никто не видел вопроса, который может дать ответ :( –

+0

Посмотрите, это может помочь: http://stackoverflow.com/questions/987072/using-application-context-everywhere –

ответ

1

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

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

10

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

Из Android разработчиков API Docs на ContextWrapper'sgetApplicationContext() метода:

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

и

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

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

CommonsWare написал детальный ответ: When to call activity context OR application context?, где он делает дело, что вызов getApplicationContext() "is almost always wrong" и обрисовывает в общих чертах несколько исключений, когда использовать его :

  • привязывается к Услуге из-за деятельности.
  • что-то необходимо привязать к контексту с глобальным охватом.

CommonsWare также ссылающийся на answer по Android Framework инженер Дайан Hackborn:

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

Другие ответы на эту же тему с дискуссии по вопросам, связанным с ApplicationContext:

10

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

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

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

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

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

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

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

+2

Я хотел бы поверить в это, надеюсь, что это правильно. –

+0

@Toro, пожалуйста, добавьте ваши выводы, чтобы поддержать комментарий. В конце концов, все пользователи должны знать, почему вы думаете, что приведенный выше ответ это неверно. –