Intereting Posts
Первое приложение для Android – Как получить доступ к компасу Ошибка установки: INSTALL_FAILED_INSUFFICIENT_STORAGE Свойство lateinit не было инициализировано Зависимость игнорируется из-за конфликта Android-студия Как использовать несколько res.srcDirs и переопределить некоторые ресурсы с помощью gradle Нет ошибки ABI при создании виртуального устройства Android Клиент jquery signalr работает, но в java его нельзя заставить работать Проблема поиска веб-браузера Android 2.2 Как нарисовать график в Android, например, приложение Wifi Analyzer? Android: Откуда взялось разрешение «Системные инструменты»? Android Как получить общую память памяти в устройстве? Как вы отображаете 2-значный NumberPicker в android? Можно ли отложить сбор мусора после загрузки Плагин Cordova для отображения аудиоинформации и элементов управления на iOS и Android Lockscreen Android M ClassCastException: FrameLayout $ LayoutParams нельзя отбрасывать в WindowManager $ LayoutParams

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

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

Сначала ответьте на свой второй вопрос: если вам нужно сохранить какое-то состояние в одноэлементном, вы можете использовать класс 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. Мой ответ: нет, вы не можете изменить объект контекста приложения.