getApplication() и getApplicationContext()
Я не мог найти удовлетворительный ответ на это, так что здесь мы идем: в чем дело с Activity/Service.getApplication() и Context.getApplicationContext()?
в нашем приложении оба возвращают один и тот же объект. В Ан ActivityTestCase однако, издеваясь приложение сделает getApplication() вернись с издевкой, но getApplicationContext будет по-прежнему возвращать другой экземпляр контекста (один введенный Android). Это жучок? Это нарочно?
Я даже не понимаю разницу в первую очередь. Есть дела за пределами тестовый набор, где оба вызова могут возвращаться с разными объектами? Когда и почему? Более того, почему это getApplication определен Activity и Service, а не Context? Не должен ли всегда быть действительный экземпляр приложения, доступный из в любом месте?
4 ответов:
очень интересный вопрос. Я думаю, что это в основном семантический смысл, а также может быть связано с историческими причинами.
хотя в текущей деятельности Android и реализации услуг,
getApplication()иgetApplicationContext()возврат одного и того же объекта, нет никакой гарантии, что это всегда будет иметь место (например, в конкретной реализации поставщика).поэтому, если вы хотите, чтобы класс приложения, зарегистрированный в Манифесте, вы должны никогда вызов
getApplicationContext()и приведите его к своему приложению, потому что это может быть не экземпляр приложения (который вы, очевидно, испытали с тестовой платформой).почему ?
getApplication()доступно только в классе Activity и классе Service, тогда какgetApplicationContext()объявляется в классе контекста.это на самом деле означает одно : при написании кода в широковещательном приемнике, который не является контекстом, но получает контекст в своем onReceive метод, вы можете только позвонить
getApplicationContext(). Это также означает, что вам не гарантируется доступ к вашему приложению в BroadcastReceiver.при просмотре кода Android вы видите, что при подключении activity получает базовый контекст и приложение, и это разные параметры.
getApplicationContext()делегаты это называетсяbaseContext.getApplicationContext().еще одна вещь : в документации говорится, что в большинстве случаев вам не нужно подкласс приложения:
обычно нет необходимости в подклассе
Application. В большинстве ситуаций, статические синглеты могут обеспечить такую же функциональность в более модульном путь. Если ваш синглтон нуждается в глобальном контексте (например, для регистрации приемники широковещания), функция для того чтобы получить его можно дать аContextвнутри которой используетсяContext.getApplicationContext()когда сначала строим синглтон.я знаю, что это не точный и точный ответ, но все же, делает это ответь на свой вопрос?
сравнить
getApplication()иgetApplicationContext().
getApplicationвозвращаетApplicationобъект, который позволит вам управлять вашим глобальным состоянием приложения и реагировать на некоторые ситуации устройства, такие какonLowMemory()иonConfigurationChanged().
getApplicationContextвозвращает глобальный контекст приложения-отличие от других контекстов заключается в том, что, например, контекст действия может быть уничтожен (или иным образом сделан недоступно) на Android, когда ваша деятельность заканчивается. Контекст приложения остается доступным все время существования объекта приложения (который не привязан к конкретномуActivity) так что вы можете использовать это для таких вещей, как уведомления для этого требуется контекст, который будет доступен в течение более длительных периодов и не зависит от переходных объектов пользовательского интерфейса.Я думаю, это зависит от того, что делает ваш код, могут ли они быть или не быть одинаковыми - хотя при нормальном использовании я ожидал бы их быть иными.
похоже, это связано с контекстной оберткой. Большинство классов, производных от
Contextна самом делеContextWrapper, который по существу делегирует в другой контекст, возможно, с изменениями оберткой.контекст-это общая абстракция, которая поддерживает насмешки и проксирование. Поскольку многие контексты привязаны к объекту с ограниченным временем жизни, такому как
Activity, должен быть способ получить более длительный контекст, для целей например, регистрация для будущих уведомлений. Это достигается с помощьюContext.getApplicationContext(). Логическая реализация заключается в возврате глобальногоApplicationобъект, но ничто не мешает реализации контекста возвращать оболочку или прокси с подходящим временем жизни вместо этого.деятельность и услуги, более конкретно связанные с
Application
чтобы ответить на вопрос, getApplication() возвращает объект приложения, а getApplicationContext() возвращает объект контекста. Основываясь на ваших собственных наблюдениях, я бы предположил, что контекст обоих идентичен (т. е. за кулисами класс приложения вызывает последнюю функцию для заполнения контекстной части базового класса или происходит какое-то эквивалентное действие). На самом деле не имеет значения, какую функцию вы вызываете, если вам просто нужен контекст.
Comments