Я новичок в андроид , и я пытаюсь понять разницу между 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);
android
android-intent
this
toast
android-context
Pheonix7
источник
источник
Ответы:
Toast и Intent требуют ссылки на контекст . И getApplication , getApplicationContext , LoginActivity.this и getBaseContext , все они предлагают ссылку на контекст.
Теперь смущает объявление разных контекстов и их конкретное использование. Чтобы упростить задачу, вы должны посчитать два типа контекста, доступных в платформе Android.
Контекст приложения привязан к жизненному циклу приложения и всегда остается неизменным на протяжении всего жизненного цикла приложения. Итак, если вы используете Toast , вы можете использовать контекст приложения или даже контекст активности (оба), потому что тост может быть поднят из любого места в вашем приложении и не привязан к окну.
Активность контекста прилагается к жизненному циклу своей деятельности и может быть уничтожен , если данный вид деятельности
onDestroy()
повышается. Если вы хотите запустить новое действие, вам необходимо использовать контекст действия в его намерении, чтобы новое действие запуска было связано с текущим действием (с точки зрения стека действий). Однако вы также можете использовать контекст приложения для запуска нового действия, но тогда вам нужно установить флаг,Intent.FLAG_ACTIVITY_NEW_TASK
чтобы рассматривать его как новую задачу.Теперь по поводу ваших дел:
LoginActivity.this
хотя это относится к вашему собственному классу, который расширяет класс Activity, но базовый класс (Activity) также расширяет класс Context, поэтому его можно использовать для предложения контекста активности.getApplication()
хотя он ссылается на объект Application, но класс Application расширяет класс Context, поэтому его можно использовать для предложения контекста приложения.getApplicationContext()
предлагает контекст приложения.getBaseContext()
предлагает контекст деятельности.источник
Context
->ContextWrapper
-> 1.Application
& 2.ContextThemeWrapper
->Activity
; иgetBaseContext()
это методContextWrapper
, такgetBaseContext() offers activity context.
же как иApplication Context
тоже ... не так ли?Ответ Вакаса очень ясен и полон, однако я хотел бы дополнительно прояснить разницу между использованием
this
vs.getBaseContext()
илиgetApplication()
vsgetApplicationContext()
.. ОбаActivity
иApplication
расширяют неContext
себя, аContextWrapper
, что являетсяЭтот «реальный» контекст - это то, что вы получаете, используя
getBaseContext()
.Итак, хотя
this
(дляActivity
) иgetBaseContext()
оба дают контекст деятельности, ониthis != getBaseContext()
) иthis
немного менее эффективен, поскольку вызовы проходят дополнительный уровень косвенного обращения. Я сомневаюсь, что это имеет какое-то практическое значение.Же логика относится и к
getApplication()
VS.getApplicationContext()
.источник
getBaseContext()
это известно, разработчики Android от Google предложили следующее: «Не используйте getBaseContext (), просто используйте имеющийся у вас контекст». По сути, они предлагают вам использоватьthis
для Activity.getBaseContext
я нашел в Интернете. Спасибо!!приведенная выше строка - это Activity, которая, очевидно, является контекстом ... это используется, когда вы создаете некоторые AlertDialogs ... В некоторых местах обязательно, чтобы вы использовали Activity Context ...
То же самое здесь для метода make text требуется контекст, а само приложение реализует
Context
это наиболее предпочтительный способ, поскольку он
Context
живет до завершения работы приложения.этот контекст доступен для виджетов и представлений ..
Но все они дают объект Context и ничего больше ..
источник
getApplicationContext()
во всех ситуациях, но желательно, чтобы вы использовалиthis
Toast в Activity.Class.this используется, если ваш класс расширяет Activity getapplication () используется ссылочное приложение, а приложение расширяет контекст приложения getbasecontext () ссылается на контекст вашего действия, ссылается на контекст жизненного цикла вашей активности applicationcontext ссылается на жизненный цикл вашего приложения
источник