getApplication (), getApplicationContext (), getBaseContext () ve someClass.this arasındaki fark ve ne zaman kullanılacağı


122

Ben android yeniyim ve ben arasındaki farkı anlamaya çalışıyorum getApplication(), getApplicationContext(,) getBaseContext(), getContext()ve someClass.thisözellikle aşağıdaki kod satırları bu yöntemleri kullanmak ve:

Bir tost fırlattığımda, bunlar arasındaki fark nedir ve hangi durumlarda kullanırım?

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();

amaçlarla aynı:

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);


yalnızca bağlamı ve baseContext'i işlerler. ancak 2 bağlamdaki tüm kullanımlarını anlamak istiyorum. teşekkürler
Pheonix7

Yanıtlar:


216

Toast ve Intent , her ikisi de bağlama referans gerektirir . Ve getApplication , getApplicationContext , LoginActivity.this ve getBaseContext , bunların tümü bağlama referans sunar.

Şimdi kafa karıştıran şey, farklı bağlamların beyanı ve özel kullanımlarıdır. İşleri basitleştirmek için, Android çerçevesinde bulunan iki tür bağlamı saymalısınız.

  1. Uygulama Bağlamı
  2. Etkinlik Bağlamı

Uygulama bağlamı, uygulamanın yaşam döngüsüne bağlıdır ve uygulama ömrü boyunca her zaman aynı kalacaktır. Dolayısıyla , Toast kullanıyorsanız , uygulama bağlamını veya hatta etkinlik bağlamını (her ikisini de) kullanabilirsiniz çünkü bir tost, uygulamanızın herhangi bir yerinden yükseltilebilir ve bir pencereye eklenmez.

Aktivite bağlamı, Aktivitenin yaşam döngüsüne eklenir ve aktiviteler onDestroy()yükseltilirse yok edilebilir . Yeni bir aktivite başlatmak istiyorsanız , yeni başlatma aktivitesinin mevcut aktiviteye (aktivite yığını açısından) bağlanması için aktivitenin bağlamını Amacında kullanmanız gerekir . Bununla birlikte, yeni bir etkinlik başlatmak için uygulamanın bağlamını da kullanabilirsiniz, ancak daha sonra bunu Intent.FLAG_ACTIVITY_NEW_TASKyeni bir görev olarak ele almak için bayrak ayarlamanız gerekir .

Şimdi davalarınıza bakarsak:

LoginActivity.this Activity sınıfını genişleten kendi sınıfınıza atıfta bulunmasına rağmen, ancak temel sınıf (Activity) da Context sınıfını genişletir, bu nedenle aktivite bağlamı sunmak için kullanılabilir.

getApplication() Application nesnesine atıfta bulunmasına rağmen, Application sınıfı Context sınıfını genişletir, bu nedenle uygulama bağlamı sunmak için kullanılabilir.

getApplicationContext() uygulama bağlamı sunar.

getBaseContext() etkinlik bağlamı sunar.

İpuçları: Ne zaman manipüle etmeniz gerekiyorsa, Activity-Context'eViews gidin , aksi takdirde Application-Context yeterli olacaktır.


11
yani doğru anlarsam, bazıClass.this, getBaseContext ve getContext () etkinlik bağlamları iken getApplicationContext () ve getApplication () uygulama bağlamları mı?
Pheonix7

bağlam sadece bir çevre hakkında bilgidir, değil mi?
committedandroider

Evet, uygulamayı barındıran sandbox gibi
waqaslam

@committedandroider çünkü etkinlik bağlamı seçilen tema için ekstra bilgi içerir, bu nedenle görünümler kodda oluşturulduğunda doğru tema otomatik olarak uygulanır. Ayrıntılı bilgi için, okumak olabilir bu
waqaslam

@waqaslam, android sdk Sınıflarına atıfta bulunur, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; ve getBaseContext()yöntemi olduğu ContextWrapperbu nedenle, getBaseContext() offers activity context.hem de Application Contexto ... çok değil?
Bhuro

26

Waqas'ın cevabı çok açık ve eksiksizdir, ancak kullanmak thisile getBaseContext()veya ile getApplication()karşılaştırmak arasındaki farkı daha da açıklığa kavuşturmak istiyorum getApplicationContext(). Hem Activityve Applicationuzatmaz Contextkendisi ama ContextWrapperbir olan

"Bunun vekaleten uygulanması, Contexttüm çağrılarını diğerine delege eder Context".

Bu "gerçek" bağlam, kullanarak elde ettiğiniz şeydir getBaseContext().

Dolayısıyla this(için Activity) ve getBaseContext()her ikisi de etkinlik bağlamını verse de,

  • (a) aynı nesneye atıfta bulunmayın ( this != getBaseContext()) ve
  • (b) thisçağrılar fazladan bir dolaylı yönlendirme düzeyinden geçtiği için bağlam üzerinden arama biraz daha az etkilidir. Yine de pratikte herhangi bir fark yarattığından şüpheliyim.

Aynı mantık, getApplication()vs. için de geçerlidir getApplicationContext().


Kadarıyla şöyle getBaseContext()"Sadece sahip Bağlam kullanın getBaseContext () kullanmayın.": İlgilenir, Google'ın Android Geliştiricileri bu önerdi Yani aslında thisAktiviteler için kullanmanızı öneriyorlar .
ChuongPham

getBaseContextİnternette bulduğum en net açıklama bu. Teşekkürler!!
q126y

6
LoginActivity.this 

yukarıdaki satır, açıkça bir Bağlam olan bir Etkinliktir. Bu, bazı UyarıDialogları oluşturduğunuzda kullanılır ... Bazı yerlerde Etkinlik Bağlamını kullanmanız zorunludur ...

getApplication()

Burada da aynı şekilde metin oluşturma yönteminin Bağlam ve Uygulama gerektirmesi gerekir Context

getApplicationContext()

Bu, ContextUygulama kapanana kadar yaşadığı için en çok tercih edilen yoldur .

getBaseContext()

bu Bağlam, widget'lar ve Görünümler tarafından kullanılabilir ..

Ama hepsi bir Bağlam nesnesi verir ve başka hiçbir şey vermez ..


Bu yüzden bir tost mesajında ​​veya bir amaç oluştururken, getApplicationContext () kullanmak en doğru yöntem olsa da hepsi aynı etkiye sahip mi?
Pheonix7

1
@Hassan Samii: Toast getApplicationContext()için her durumda kullanabilirsiniz , ancak thisbir Aktivitede Toast yaparken kullanmanız tercih edilir .
ChuongPham

0

Class.this, sınıfınız Activity getapplication () 'ı genişletirse kullanılır başvuru uygulaması ve uygulama uygulama bağlamını genişletir getbasecontext () aktivite bağlamı içeriğinize bakın, aktivite yaşam döngüsü bağlamınıza bakın applicationcontext, uygulamanızın yaşam döngüsüne bakın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.