2015-07-13 13 views
9

Android'de bağlamsal işlemlerin ayrıntılarını ve püf noktalarını öğrenmek için bazı sözde "iyi" kaynaklara gidiyorum Birden fazla zamana rastladığım bir modele rastladım anlama.Neden ContextWrapper'ı doğrudan "bu" dan örtük bir bağlam yerine bir etkinlikte kullanmalısınız

Bir örtülü bağlamı aynı derecede kullanabildiğinizde bir ContextWrapper kullanmanın avantajı nedir? Örneğin

neden getFilesDir() ContextWrapper sınıfında tanımlanan halde Bunun yerine sadece
... 
File filesDir = getFilesDir(); 
... 

arasında

... 
ContextWrapper cw = new ContextWrapper(getApplicationContext()) 
File filesDir = cw.getFilesDir(); 
... 

(bir faaliyet sınıfında, doğrudan tanımlandığı gibidir) bir etkinlik yönteminde aşağıdaki kullanımı Faaliyet yine de ContextWrapper'ın bir alt sınıfıdır, böylece yönteme doğrudan erişebilirsiniz.

Bu ek karmaşıklık adresi hangi olası sorunu (göremediğim) yapar?

+0

'Application'' ContextWrapper' uzanır de. – tynn

cevap

6

Sunuladığınız senaryoda (ve bağlamında) bir değişiklik yapamayacağını (ve yanılıyor olabileceğimi) söyleyebilirim. getApplicationContext().getFilesDir() sadece kolayca kullanılabilir. Ancak, ContextWrapper'un diğer senaryolarda yararlı olabileceğine inanıyorum. Anladığım kadarıyla, bu adaptör kalıbı. Yalnızca geçmek orijinal içerik referansına diğer tüm proxy ederken bazı yöntemler için farklı davranış sağlamak isteyebilirsiniz

Kontrol dışarı RemoteViews kod bu parça.

// RemoteViews may be built by an application installed in another 
// user. So build a context that loads resources from that user but 
// still returns the current users userId so settings like data/time formats 
// are loaded without requiring cross user persmissions. 
final Context contextForResources = getContextForResources(context); 
Context inflationContext = new ContextWrapper(context) { 
    @Override 
    public Resources getResources() { 
     return contextForResources.getResources(); 
    } 
    @Override 
    public Resources.Theme getTheme() { 
     return contextForResources.getTheme(); 
    } 
}; 
İlgili konular