Arasındaki fark nedir getContext()
, getApplicationContext()
, getBaseContext()
, ve " this
"?
Bu basit bir soru olmasına rağmen, aralarındaki temel farkı anlayamıyorum. Lütfen mümkünse bazı kolay örnekler verin.
Arasındaki fark nedir getContext()
, getApplicationContext()
, getBaseContext()
, ve " this
"?
Bu basit bir soru olmasına rağmen, aralarındaki temel farkı anlayamıyorum. Lütfen mümkünse bazı kolay örnekler verin.
Yanıtlar:
View.getContext()
: Görünümün çalışmakta olduğu bağlamı döndürür. Genellikle etkin olan Etkinlik.
Activity.getApplicationContext()
: Tüm uygulamanın bağlamını döndürür (tüm Etkinliklerin içinde çalıştığı işlem). Yalnızca geçerli Etkinliğe değil, tüm uygulamanın yaşam döngüsüne bağlı bir bağlama ihtiyacınız varsa, geçerli Etkinlik bağlamı yerine bunu kullanın.
ContextWrapper.getBaseContext()
: Bir Bağlama başka bir bağlam içinden erişmeniz gerekiyorsa, bir BağlamWrapper kullanırsınız. ContextWrapper'a getBaseContext () aracılığıyla erişildiği içeriden belirtilen Context.
this
ve getContext()
her zaman aynı değildir, örneğin Activity sınıfında kullanabilirsiniz, this
çünkü Activity
kaynağını devralır Context
ancak yöntem sınıfta getContext()
değildir Activity
. @mikedroid @KCRaju
Çoğu cevaplar zaten kapsayacak getContext()
ve getApplicationContext()
ancak getBaseContext () nadiren açıklanmıştır.
Yöntem getBaseContext()
yalnızca a ContextWrapper
. Android, ContextWrapper
aşağıdakileri Context
kullanarak mevcut bir etrafında oluşturulmuş bir sınıf sunar :
ContextWrapper wrapper = new ContextWrapper(context);
A kullanmanın yararı, ContextWrapper
“orijinal Bağlamı değiştirmeden davranışı değiştirmenize” izin vermesidir. Örneğin, adlı bir etkinliğiniz varsa, teması farklı olan bir a myActivity
oluşturabilirsiniz :View
myActivity
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
Eğer tarafından sağlanan en işlevlerini geçersiz kılmak sağlar çünkü gerçekten güçlüdür Context
erişim kaynaklarına kodu dahil (örneğin openFileInput()
, getString()
), diğer bileşenlerle etkileşim (örn sendBroadcast()
, registerReceiver()
), istekler izinleri (örn checkCallingOrSelfPermission()
) ve çözme dosya sistemi yerleri (örn getFilesDir()
). ContextWrapper
cihaza / sürüme özgü sorunlar üzerinde çalışmak veya bağlam gerektiren Görünümler gibi bileşenlere tek seferlik özelleştirmeler uygulamak için gerçekten yararlıdır.
GetBaseContext () yöntemi, etrafıContextWrapper
saran “base” Bağlamına erişmek için kullanılabilir . Eğer, örneğin, bir sorun olup olmadığını kontrol etmek gerekiyorsa “temel” bağlamına erişmeye gerekebilir Service
, Activity
ya da Application
:
public class CustomToast {
public void makeText(Context context, int resId, int duration) {
while (context instanceof ContextWrapper) {
context = context.baseContext();
}
if (context instanceof Service)) {
throw new RuntimeException("Cannot call this from a service");
}
...
}
}
Veya bir yöntemin “paketlenmemiş” sürümünü çağırmanız gerekirse:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}
ContextWrapper
Android çerçevesinin geliştiricileri tarafından verilen en kötü kararlardan biri olduğunu söyleyebilirim . Doğru şeyi yapmak ve Tek Sorumluluk yönündeki kodu yeniden düzenlemek yerine bütün bir Tanrı Nesneleri ailesi yarattıklarını anladıklarında, miras ağacını derinleştirerek Bağlam davranışını değiştirmeye izin veren çirkin bir hack eklediler. En çirkin kötü yazılım mühendisliği. Bize gelince, geliştiriciler, IMHO hiç kimse kullanmamalıdır getBaseContext()
veya ContextWrapper
. Eğer - büyük bir "kod kokusu" olduğunu.
CustomToast
Kodun tamamını görmek istiyorum . Als :)))
getApplicationContext () - Uygulamada çalışan tüm etkinliklerin bağlamını döndürür.
getBaseContext () - Bağlam'a uygulama içindeki başka bir bağlamdan erişmek istiyorsanız erişebilirsiniz.
getContext () - Bağlam görünümünü yalnızca geçerli çalışan etkinliği döndürür.
"Bağlamın ne olduğu" sorusu Android evrenindeki en zor sorulardan biridir.
Bağlam, sistem kaynaklarına erişen, uygulamanın statik varlıklarını alan, izinleri denetleyen, kullanıcı arabirimi manipülasyonları gerçekleştiren ve daha pek çok yöntem tanımlar. Özünde, Context
üretimde Tanrı Nesnesi anti-paterninin bir örneğidir.
Hangi türden Context
kullanmamız gerektiğinde, çok karmaşık hale gelir, çünkü Tanrı Nesnesi olmak dışında, Context
alt sınıfların hiyerarşi ağacı Liskov İkame İlkesini vahşice ihlal eder.
Bu blog yazısıContext
farklı durumlarda sınıfların uygulanabilirliğini özetlemeye çalışmaktadır .
Tamamlanmak için ana tabloyu bu yazıdan kopyalayayım:
+----------------------------+-------------+----------+---------+-----------------+-------------------+ | | Application | Activity | Service | ContentProvider | BroadcastReceiver | +----------------------------+-------------+----------+---------+-----------------+-------------------+ | Show a Dialog | NO | YES | NO | NO | NO | | Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ | | Layout Inflation | NO² | YES | NO² | NO² | NO² | | Start a Service | YES | YES | YES | YES | YES | | Bind to a Service | YES | YES | YES | YES | NO | | Send a Broadcast | YES | YES | YES | YES | YES | | Register BroadcastReceiver | YES | YES | YES | YES | NO³ | | Load Resource Values | YES | YES | YES | YES | YES | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- Bir uygulama buradan Etkinlik başlatabilir, ancak yeni bir görevin oluşturulmasını gerektirir. Bu, belirli kullanım durumlarına uygun olabilir, ancak uygulamanızda standart olmayan arka yığın davranışları oluşturabilir ve genellikle önerilmez veya iyi uygulama olarak kabul edilmez.
- Bu yasaldır, ancak enflasyon, uygulamanızda tanımlanmış olanlarla değil, üzerinde çalıştığınız sistem için varsayılan temayla yapılır.
- Android 4.2 ve sonraki sürümlerde yapışkan bir yayının geçerli değerini elde etmek için kullanılan alıcı boşsa izin verilir.
Context
yeni oluşturulan bileşenler hakkında Actvity
veya Application
bu bileşenler hakkında bilgi sağlar .
İlgili Context
yeni oluşturulan bileşenlere sağlanmalıdır (olup, uygulama kontekst veya etkinlik bağlamı)
Yana Activity
bir alt sınıfıdır Context
, birini kullanabilirsiniz this
o etkinliğin içeriği almak için
Kullanmanız gerektiğini anladım:
Bağlam etkinliği yerine bağlam uygulamasını kullanmayı deneyin
getApplicationContext ()
bu uygulama seviyesi için kullanılır ve tüm faaliyetlere atıfta bulunur.
getContext () ve getBaseContext ()
büyük olasılıkla aynıdır.Bunlar sadece canlı olan mevcut aktivitelere yönlendirilir.
bu
her zaman geçerli sınıf nesnesine bakın.
A Context
: