Разница и когда использовать getApplication(), getApplicationContext(), getBaseContext() и someClass.this

Я новичок в android, и я пытаюсь понять разницу между getApplication(), getApplicationContext(), getBaseContext(), getContext() и someClass.this и особенно когда использовать эти методы в следующих строки кода:

Когда я запускаю тост, какая разница между ними и в каких случаях я их использую?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

то же самое с намерениями:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);

Ответ 1

Toast и Цель, для этого требуется ссылка на контекст. И getApplication, getApplicationContext, LoginActivity.this и getBaseContext, все они предлагают ссылку на контекст.

Теперь это смущает декларация разных контекстов и их специфическое использование. Чтобы все было просто, вы должны считать два типа контекста доступными в рамках Android.

  • Контекст приложения
  • Контекст активности
Контекст

Application привязан к жизненному циклу приложения и всегда будет таким же на протяжении всего срока службы. Поэтому, если вы используете Toast, вы можете использовать контекст приложения или даже контекст активности (оба), потому что тост может быть поднят из любого места в вашем приложении и не привязан к окну.

Контекст

Активность привязан к жизненному циклу активности и может быть уничтожен, если активизирована активность onDestroy(). Если вы хотите запустить новое действие, вам нужно будет использовать контекст активности в своем намерении, чтобы новая активность запуска была связана с текущей деятельностью (с точки зрения стека активности). Однако вы также можете использовать контекст приложения для запуска нового действия, но тогда вам нужно установить флаг Intent.FLAG_ACTIVITY_NEW_TASK в намерении рассматривать его как новую задачу.

Теперь обратимся к вашим случаям:

LoginActivity.this, хотя он ссылается на ваш собственный класс, который расширяет класс Activity, но базовый класс (Activity) также расширяет класс Context, поэтому его можно использовать для контекста активности.

getApplication(), хотя ссылается на объект Application, но класс Application расширяет класс Context, поэтому его можно использовать для предоставления контекста приложения.

getApplicationContext() предлагает контекст приложения.

getBaseContext() предлагает контекст активности.

Советы: всякий раз, когда вам нужно манипулировать Views, тогда идите Activity-Context, иначе Application-Context будет достаточно.

Ответ 2

Ответ Вакаса очень ясный и полный, однако я хотел бы еще раз пояснить разницу между использованием this vs. getBaseContext() или getApplication() vs. getApplicationContext(). Оба Activity и Application распространяются не на Context, а на ContextWrapper, который является

"Проксирование реализации Context, которое просто делегирует все свои вызовы другому Context".

Этот "реальный" контекст - это то, что вы получаете, используя getBaseContext().

Итак, хотя this (для Activity) и getBaseContext() дают контекст активности, они

  • (a) не относятся к одному и тому же объекту (this != getBaseContext()) и
  • (b) вызов контекста через this несколько менее эффективен, так как вызовы проходят через дополнительный уровень косвенности. Я сомневаюсь, что это имеет какое-то практическое значение.

То же самое относится к getApplication() vs. getApplicationContext().

Ответ 3

LoginActivity.this 

приведенная выше строка - это Activity, которая является Obveveously Контекстом. Это используется, когда вы создаете некоторые AlertDialogs... В некоторых местах его обязательным для использования контекста активности...

getApplication()

То же самое, что и для текстового метода make. Контекст и приложение сами реализуют Context

getApplicationContext()

это наиболее предпочтительный способ, так как этот Context работает до тех пор, пока приложение не выключится.

getBaseContext()

этот контекст доступен для виджетов и видов.

Но все они дают объект Контекст и ничего больше.

Ответ 4

Класс. Используется, если ваш класс расширяет действие Используемое приложение getapplication() ссылается на приложение и приложение расширяет контекст приложения getbasecontext() ссылается на ваш контекст активности контекст относится к контексту жизненного цикла вашей деятельности applicationcontext ссылаются на ваш жизненный цикл приложения