getApplication() и getApplicationContext()



Я не мог найти удовлетворительный ответ на это, так что здесь мы идем: в чем дело с Activity/Service.getApplication() и Context.getApplicationContext()?



в нашем приложении оба возвращают один и тот же объект. В Ан ActivityTestCase однако, издеваясь приложение сделает getApplication() вернись с издевкой, но getApplicationContext будет по-прежнему возвращать другой экземпляр контекста (один введенный Android). Это жучок? Это нарочно?



Я даже не понимаю разницу в первую очередь. Есть дела за пределами тестовый набор, где оба вызова могут возвращаться с разными объектами? Когда и почему? Более того, почему это getApplication определен Activity и Service, а не Context? Не должен ли всегда быть действительный экземпляр приложения, доступный из в любом месте?

694   4  

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

    Ничего не найдено.