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

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

6 ответов

Решение

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

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

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

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

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

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

Сообщение - обработчик Intent Buntle Intent putExtra

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

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

Гугл так и говорит в обзоре классов приложений.

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

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

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

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

Хотя верхний ответ здесь технически правильный, он противоречит текущим рекомендациям Google, приведенным ниже на странице:

https://developer.android.com/reference/android/app/Application.html

"Примечание. Обычно нет необходимости создавать подклассы Application. В большинстве случаев статические синглтоны могут обеспечивать ту же функциональность более модульным способом. Если вашему синглтону требуется глобальный контекст (например, для регистрации широковещательных приемников), включите Context.getApplicationContext() в качестве аргумента контекста при вызове метода getInstance() вашего синглтона ".

В двух словах, опасно хранить контексты, время жизни которых не совпадает со временем жизни класса, в котором вы его храните. Контекст приложения должен совпадать с контекстом вашего синглтона, поскольку они имеют одно и то же время жизни процесса.

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

Другие вопросы по тегам