різниця і коли використовувати getApplication (), getApplicationContext (), getBaseContext () та someClass.this


121

Я новачок в андроїд , і я намагаюся зрозуміти різницю між 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);


вони обробляють лише контекст і baseContext. але я хотів би зрозуміти всі їхні звичаї у двох контекстах. дякую
Pheonix7

Відповіді:


215

Тост і Намір вимагають посилання на контекст . І getApplication , getApplicationContext , LoginActivity.this та getBaseContext , усі вони пропонують посилання на контекст.

Тепер річ плутається в оголошенні різних контекстів та їх конкретного використання. Щоб зробити простішими, вам слід порахувати два типи контексту, доступні в рамках Android.

  1. Контекст програми
  2. Контекст діяльності

Контекст програми додається до життєвого циклу програми і завжди буде однаковим протягом усього життя програми. Отже, якщо ви використовуєте Toast , ви можете використовувати контекст програми або навіть контекст діяльності (обидва), оскільки тост можна піднімати з будь-якого місця у вашій програмі і не прикріплений до вікна.

Контекст діяльності приєднаний до життєвого циклу діяльності та може бути зруйнований, якщо активність onDestroy()буде підвищена. Якщо ви хочете запустити нову діяльність, вам потрібно використовувати контекст діяльності в її намірі, щоб нова активізація запуску була пов'язана з поточною діяльністю (з точки зору стеку активності). Однак ви можете також використовувати контекст програми для запуску нової діяльності, але тоді вам потрібно встановити прапор, Intent.FLAG_ACTIVITY_NEW_TASKщоб розглянути його як нове завдання.

Тепер посилаємось на ваші випадки:

LoginActivity.this хоча його посилання на ваш власний клас, який розширює клас активності, але базовий клас (активність) також розширює клас контексту, тому його можна використовувати для пропонування контексту діяльності.

getApplication() хоча його посилання на об’єкт Application, але клас Application розширює клас контексту, тому його можна використовувати для пропонування контексту програми.

getApplicationContext() пропонує контекст програми.

getBaseContext() пропонує контекст діяльності.

Поради: Щоразу, коли вам потрібно буде маніпулювати, Viewsтоді перейдіть до Activity-Context , інакше Application-Context буде достатньо.


11
тож, якщо я зрозумію це правильно, someClass.this, getBaseContext і getContext () - це контексти діяльності, тоді як getApplicationContext () та getApplication () - це контексти програми?
Pheonix7

контекст - це лише інформація про навколишнє середовище, правда?
committedandroider

Так, це схоже на пісочницю, де розміщується програма
waqaslam

@commissandroider, оскільки контекст діяльності містить додаткову інформацію для обраної теми, тому коли створені представлення в коді, то правильна тема буде застосована автоматично. Для отримання додаткової інформації ви можете прочитати це
waqaslam

@waqaslam з посиланням на android sdk Class, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; і getBaseContext()це метод ContextWrapper, так getBaseContext() offers activity context.само як Application Contextі ... чи не так?
Бхуро

26

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

"Шкільна реалізація Contextцього просто делегує всі свої дзвінки іншому Context".

Цей "реальний" контекст - це те, що ви отримуєте, використовуючи getBaseContext().

Тож хоча this(для Activity) і getBaseContext()обидва дають контекст діяльності, вони

  • (а) не посилаються на один і той же об'єкт ( this != getBaseContext()) і
  • (b) контекст виклику через thisтрохи менш ефективний, оскільки виклики проходять через додатковий рівень непрямості. Я сумніваюся, що це має певні практичні значення.

Ж логіка відноситься і до getApplication()VS. getApplicationContext().


Що getBaseContext()стосується, розробники Android для Android запропонували таке: "Не використовуйте getBaseContext (), просто використовуйте контекст, який у вас є". Тож фактично вони пропонують вам використовувати thisдля заходів.
ChuongPham

це найяскравіше пояснення getBaseContextя знайшов в Інтернеті. Дякую!!
q126y

6
LoginActivity.this 

вищевказаний рядок - це активність, яка в обов'язковому порядку є Контекстом. Він використовується, коли ви створюєте деякі AlertDialogs ... У деяких місцях обов'язковим є використання контексту діяльності ...

getApplication()

Тут же потрібен метод make text, який потребує контекст і сам додаток Context

getApplicationContext()

це найбільш бажаний спосіб, оскільки це Contextживе до тих пір, поки додаток не вимикається.

getBaseContext()

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

Але всі вони дають об'єкт контексту і нічого іншого ..


тож у повідомленні тосту або при створенні наміру всі вони мають однаковий ефект, навіть якщо використання getApplicationContext () є найбільш правильним?
Pheonix7

1
@Hassan Samii: Для Toast ви можете використовувати getApplicationContext()для будь-якої ситуації, але бажано, щоб ви використовували, thisроблячи Toast у діяльності.
ChuongPham

0

Class.це використовується, якщо ваш клас розширює застосування getapplication (), що використовується, посилається на додаток, а додаток розширює контекст програми getbasecontext () посилається на контекст вашого контексту діяльності, посилається на контекст життєвого циклу вашої діяльності applicationcontext посилається на життєвий цикл програми

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.