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

122

Я новичок в андроид , и я пытаюсь понять разницу между 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);
Pheonix7
источник
Возможный дубликат stackoverflow.com/q/1026973/741249 или stackoverflow.com/q/6854265/741249
THelper
они обрабатывают только контекст и базовый контекст. но я хотел бы понять все их использования в двух контекстах. спасибо
Pheonix7

Ответы:

216

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

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

  1. Контекст приложения
  2. Контекст деятельности

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

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

Теперь по поводу ваших дел:

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

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

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

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

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

waqaslam
источник
11
так что, если я правильно понял, someClass.this, getBaseContext и getContext () являются контекстами активности, а getApplicationContext () и getApplication () - контекстами приложения?
Pheonix7,
контекст - это просто информация об окружающей среде, верно?
Committedandroider
Да, это похоже на песочницу, в которой размещено приложение
waqaslam
@committedandroider, потому что контекст действия содержит дополнительную информацию для выбранной темы, поэтому, когда представления создаются в коде, правильная тема будет применяться автоматически. Для получения дополнительной информации вы можете прочитать это
waqaslam
@waqaslam, относящийся к классам SDK Android, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; и getBaseContext()это метод ContextWrapper, так getBaseContext() offers activity context.же как и Application Contextтоже ... не так ли?
Bhuro
26

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

«Проксирующая реализация Contextэтого просто делегирует все свои вызовы другому Context».

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

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

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

Же логика относится и к getApplication()VS. getApplicationContext().

AlexR
источник
Насколько getBaseContext()это известно, разработчики Android от Google предложили следующее: «Не используйте getBaseContext (), просто используйте имеющийся у вас контекст». По сути, они предлагают вам использовать thisдля Activity.
ChuongPham
это самое ясное объяснение, которое getBaseContextя нашел в Интернете. Спасибо!!
q126y
6
LoginActivity.this 

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

getApplication()

То же самое здесь для метода make text требуется контекст, а само приложение реализует Context

getApplicationContext()

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

getBaseContext()

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

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

ngesh
источник
так что в тост-сообщении или при создании намерения все они имеют одинаковый эффект, хотя использование getApplicationContext () является наиболее правильным?
Pheonix7
1
@Hassan Samii: Toast можно использовать getApplicationContext()во всех ситуациях, но желательно, чтобы вы использовали thisToast в Activity.
ChuongPham
0

Class.this используется, если ваш класс расширяет Activity getapplication () используется ссылочное приложение, а приложение расширяет контекст приложения getbasecontext () ссылается на контекст вашего действия, ссылается на контекст жизненного цикла вашей активности applicationcontext ссылается на жизненный цикл вашего приложения

Чандракант Чатурведи
источник