Я не мог найти удовлетворительный ответ на этот вопрос, так что здесь мы идем: с чем дело Activity/Service.getApplication()
и Context.getApplicationContext()
?
В нашем приложении оба возвращают один и тот же объект. ActivityTestCase
Тем не менее, при имитации приложения будет getApplication()
возвращаться с имитацией, но getApplicationContext
все равно будет возвращаться другой экземпляр контекста (один введенный Android). Это ошибка? Это нарочно?
Я даже не понимаю разницу во-первых. Есть ли случаи за пределами набора тестов, когда оба вызова могут возвращаться с разными объектами? Когда и почему? Более того, почему getApplication
определяется на Activity
и Service
, но не на Context
? Разве не всегда должен быть доступный экземпляр приложения из любого места ?
Application
объект в своем приложении.Ответы:
Очень интересный вопрос Я думаю, что это в основном семантическое значение, а также может быть связано с историческими причинами.
Хотя в текущих реализациях Android Activity и Service
getApplication()
иgetApplicationContext()
возвращают один и тот же объект, нет гарантии, что это всегда будет иметь место (например, в реализации конкретного поставщика).Поэтому, если вам нужен класс Application, который вы зарегистрировали в Manifest, вы никогда не должны вызывать
getApplicationContext()
и приводить его к вашему приложению, потому что это может быть не экземпляр приложения (который вы, очевидно, испытывали в тестовой среде).Почему
getApplicationContext()
существует в первую очередь?getApplication()
доступно только в классе Activity и классе Service, тогдаgetApplicationContext()
как объявлено в классе Context.На самом деле это означает одно: при написании кода в широковещательном приемнике, который не является контекстом, а задан контекст в его методе onReceive, вы можете только вызывать
getApplicationContext()
. Это также означает, что вам не гарантирован доступ к вашему приложению в BroadcastReceiver.Глядя на код Android, вы видите, что при подключении активность получает базовый контекст и приложение, и это разные параметры.
getApplicationContext()
делегаты это вызовbaseContext.getApplicationContext()
.Еще одна вещь: в документации сказано, что в большинстве случаев вам не нужно создавать подкласс Application:
Я знаю, что это не точный и точный ответ, но все же, это отвечает на ваш вопрос?
источник
android.app.Application
это супер помощь полный. Например, у меня были бесконечные проблемы с инициализацией базы данных. Когда-то переехал вApplication.onCreate
него работал как шарм. Теперь я делаю всю системную инициализацию в,Application
и я не написал бы другое приложение без.Сравните
getApplication()
иgetApplicationContext()
.getApplication
возвращаетApplication
объект, который позволит вам управлять вашим глобальным состоянием приложения и реагировать на некоторые ситуации устройства, такие какonLowMemory()
иonConfigurationChanged()
.getApplicationContext
возвращает глобальный контекст приложения - отличие от других контекстов состоит в том, что, например, контекст активности может быть уничтожен (или иным образом недоступен) Android, когда ваша активность заканчивается. Контекст приложения остается доступным все время, пока существует объект приложения (который не привязан к конкретномуActivity
), поэтому вы можете использовать его для таких вещей, как уведомления , для которых требуется контекст, который будет доступен в течение более длительных периодов времени и не зависит от временных объектов пользовательского интерфейса.Я думаю, это зависит от того, что делает ваш код, могут ли они быть одинаковыми или нет, хотя при нормальном использовании я бы ожидал, что они будут другими.
источник
Application
этоContext
(он наследует от него), а также во время выполнения, оба метода возвращают тот же экземпляр. Так в чем же разница?Activity
контекстом иApplication
контекстом. Я размышляю о разнице междуApplication
(который является глобальным, уникальным контекстом приложения) и тем, чтоgetApplicationContext
возвращается. Последний был фактически неработоспособен до Android 1.6; Раньше всегда возвращалсяnull
.Кажется, это связано с переносом контекста. Большинство классов, производных от
Context
них, на самом деле являются aContextWrapper
, которые по существу делегируют другому контексту, возможно, с изменениями оболочкой.Контекст - это общая абстракция, которая поддерживает насмешки и проксирование. Поскольку многие контексты привязаны к объекту с ограниченным сроком службы, например
Activity
, для поиска более долгоживущего контекста необходим способ, например, регистрация будущих уведомлений. Это достигаетсяContext.getApplicationContext()
. Логическая реализация должна возвращать глобальныйApplication
объект, но ничто не мешает контекстной реализации вместо этого возвращать оболочку или прокси с подходящим временем жизни.Деятельность и услуги более конкретно связаны с
Application
объектом. Я полагаю, что полезность этого заключается в том, что вы можете создать и зарегистрировать в манифесте собственный класс, производный от него,Application
и быть уверенным, что онActivity.getApplication()
илиService.getApplication()
будет возвращать этот конкретный объект этого конкретного типа, который вы можете привести к производномуApplication
классу и использовать для любых целей. пользовательское назначение.Другими словами,
getApplication()
гарантированно вернутьApplication
объект, в то времяgetApplicationContext()
как свободен для возврата прокси.источник
Чтобы ответить на вопрос, getApplication () возвращает объект Application, а getApplicationContext () возвращает объект Context. Основываясь на ваших собственных наблюдениях, я бы предположил, что оба контекста идентичны (т.е. за кулисами класс Application вызывает последнюю функцию для заполнения части контекста базового класса или происходит какое-то эквивалентное действие). На самом деле не должно иметь значения, какую функцию вы вызываете, если вам нужен контекст.
источник