Можно ли изменить контекст приложения во время жизненного цикла приложения?

Могу ли я полагаться на утверждение, что Context приложения не меняется во время жизненного цикла приложения? Что делать, если я где-то храню context с использованием шаблона singleton, а затем использую везде, где мне нужно?

Solutions Collecting From Web of "Можно ли изменить контекст приложения во время жизненного цикла приложения?"

Сначала ответьте на свой второй вопрос: если вам нужно сохранить какое-то состояние в одноэлементном, вы можете использовать класс Application Android, и ваше Application станет вашим синглом (это также Context ). Не нужно было хранить его.

К первому вопросу о том, можно ли изменить Context во время выполнения: вроде связанного с вашим другим вопросом , я думаю, что мы можем понять это, посмотрев на ContextWrapper.attachBaseContext :

  protected void attachBaseContext(Context base) { if (mBase != null) { throw new IllegalStateException("Base context already set"); } mBase = base; } 

Итак, да, вы можете положиться на это; Его нельзя изменить, и если вы попытаетесь, он выкинет IllegalStateException .

Класс Application Android – это ваш синглтон для хранения информации, которая должна отслеживаться на этапах жизненного цикла приложений. Вы можете проверить это описание класса в руководстве – http://developer.android.com/reference/android/app/Application.html

В этой теме есть некоторые споры. Даже некоторые из людей из Google. Я считаю, что я считаю правильным подход, который в основном пытается получить контекст активности как можно дольше. Причина в том, что точка контекста предоставляет некоторые ресурсы / части вашего приложения среду, из которой работает. Чем точнее информация, которую вы передаете системе, тем менее неожиданное поведение будет происходить (т. Е .: у вас есть доступ к некоторым ресурсам в пределах контекста действия и пути от контекста приложения.

Помните, что действие представляет собой контекст, так что передача «this» сделает работу, если вы находитесь внутри действия, или «getActivity ()», если ваш код работает из фрагмента.

Более того, я должен согласиться с devmiles.com. Очень полезно использовать свой собственный класс приложений как Singleton, так как вы можете легко управлять жизненным циклом приложения и использовать его как должную среднюю точку. Еще раз, чтобы получить appContext, достаточно вызвать getApplicationContext или даже экземпляр вашего одноэлементного класса Application.

Да, вы можете положиться на то, что контекст не изменяется в течение жизненного цикла приложения!

Google говорит об этом в обзоре класса приложений .

Я думаю, что это будет идеально для вашего дела.

Приложение – одноэлементный, и я не знаю, как обойти это без изменения ядра.

Однако есть возможность встретить 2 экземпляра объекта Application, если ваш код запускает другой процесс. Одним из примеров может быть запуск удаленной службы; Это создаст другой процесс, который создаст собственный экземпляр объекта приложения.

http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample

Чтобы избежать путаницы, вы должны общаться между удаленным сервисом и остальной частью приложения, используя один из параметров Parcelable или Serializable android:

Message-Handler Intent Bundle Intent putExtra

Или создать свой собственный

Класс приложения – это класс уровня приложения для приложений для Android. Мой ответ: нет, вы не можете изменить объект контекста приложения.