Могу ли я полагаться на выражение, что приложение Context
не меняется во время жизненного цикла приложения? Что делать, если я где-то храню Context
, используя шаблон singleton, а затем использую везде, где мне нужно?
Можно ли изменить контекст приложения во время жизненного цикла приложения?
Ответ 1
Сначала ответьте на второй вопрос: если вам нужно сохранить какое-либо состояние в одноэлементном, вы можете использовать класс Android Application
, а ваш Application
станет вашим синглом (это также Context
). Не нужно было хранить его.
К первому вопросу о том, можно ли изменить Context
во время выполнения: вид связанный с вашим другим вопросом, я думаю, что мы можем понять это посмотрев ContextWrapper.attachBaseContext
:
protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
Итак, да, вы можете положиться на него; он не может быть изменен, и если вы попробуете, он выкинет IllegalStateException
.
Ответ 2
Android Application
class IS - ваш синглтон для хранения информации, которая должна отслеживаться на этапах жизненного цикла приложений. Вы можете проверить описание этого класса в руководстве - http://developer.android.com/reference/android/app/Application.html
Ответ 3
Там есть некоторые споры вокруг этой темы. Даже некоторые люди из Google. Я считаю, что это правильный подход, который в основном пытается получить контекст активности как можно дольше. Причина в том, что точка контекста предоставляет некоторые ресурсы/части вашего приложения среду, из которой работает. Чем точнее информация, которую вы передаете системе, тем менее неожиданное поведение будет происходить (т.е.: у вас есть доступ к некоторым ресурсам в области контекста действия и пути от контекста приложения.
Помните, что это Контекст, так что передача "this" сделает задание, если вы находитесь внутри действия, или "getActivity()", если ваш код работает из фрагмента.
Кроме того, я должен согласиться с devmiles.com. Очень полезно использовать свой собственный класс приложений как Singleton, так как вы можете легко управлять жизненным циклом приложения и использовать его как должную среднюю точку. Еще раз, чтобы получить appContext, достаточно вызвать getApplicationContext или даже экземпляр вашего одноименного класса приложения.
Ответ 4
Да, вы можете полагаться на то, что контекст не изменяется в течение жизненного цикла приложения!
Google так говорит в обзоре класса Application.
Я думаю, что это будет идеально для вашего дела.
Ответ 5
Приложение является одноэлементным, и я не знаю, как обойти это без изменения ядра.
Однако есть возможность встретить 2 экземпляра объекта приложения, если ваш код запускает другой процесс. Одним из примеров может быть запуск удаленной службы; это создаст другой процесс, который создаст его собственный экземпляр объекта приложения.
http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample
Чтобы избежать путаницы, вы должны общаться между удаленным сервисом и остальной частью приложения, используя один из параметров Parcelable или Serializable android:
Сообщение - обработчик Набор намерений Intent putExtra
или создать свой собственный
Ответ 6
В классе приложения используется класс уровня приложения для приложений андроида. Мой ответ: нет, вы не можете изменить объект контекста приложения.