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

Могу ли я полагаться на выражение, что приложение 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

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