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