Очень интересный вопрос. Я думаю, что это в основном смысловое значение, а также может быть связано с историческими причинами.
Хотя в текущих реализациях Android Activity и Service getApplication()
и getApplicationContext()
возвращают один и тот же объект, нет гарантии, что так будет всегда (например, в реализации конкретного поставщика).
Поэтому, если вам нужен класс Application, который вы зарегистрировали в манифесте, вы должны никогда не вызывать getApplicationContext()
и приводить его к своему приложению, потому что это может быть не экземпляр приложения (что вы, очевидно, испытали на тестовой платформе). .
Почему вообще существует getApplicationContext()
?
getApplication()
доступен только в классе Activity и классе Service, тогда как getApplicationContext()
объявлен в классе Context.
На самом деле это означает одно: при написании кода в широковещательном приемнике, который не является контекстом, но получает контекст в его методе onReceive, вы можете вызвать только getApplicationContext()
. Это также означает, что у вас нет гарантии доступа к вашему приложению в BroadcastReceiver.
Глядя на код Android, вы видите, что при присоединении действие получает базовый контекст и приложение, и это разные параметры. getApplicationContext()
делегирует свой вызов baseContext.getApplicationContext()
.
Еще одна вещь: в документации говорится, что в большинстве случаев вам не нужно создавать подклассы Application:
Обычно нет необходимости создавать подкласс Application
. В большинстве случаев статические синглтоны могут предоставлять ту же функциональность более модульным способом. Если вашему синглтону нужен глобальный контекст (например, для регистрации широковещательных приемников), функции для его получения может быть присвоено Context
, которое внутренне использует Context.getApplicationContext()
при первом построении синглтона.
Я знаю, что это не точный и точный ответ, но тем не менее, отвечает ли он на ваш вопрос?
person
Pierre-Yves Ricau
schedule
20.07.2011
Application
в своем приложении. - person Christopher Orr   schedule 16.02.2011