2015-07-13 9 views
9

Passando attraverso alcune fonti di fonti "buone" per apprendere i dettagli e i trucchi della gestione del contesto in Android, mi sono imbattuto in uno schema più volte che non riesco a capire.Perché utilizzare ContextWrapper direttamente in un'attività invece di contesto implicito da "questo"

Qual è il vantaggio dell'utilizzo di ContextWrapper quando è possibile utilizzare egualmente il contesto implicito?

Per esempio Perché utilizzare il seguente in un metodo di attività (definita direttamente in una classe di attività)

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

Invece di limitarsi a

... 
File filesDir = getFilesDir(); 
... 

anche se getFilesDir() viene definito nella classe ContextWrapper l'attività è comunque una sottoclasse di ContextWrapper in modo da avere comunque accesso diretto al metodo.

Quindi quale potenziale problema (che non riesco a vedere) ha aggiunto questo indirizzo di complessità?

+0

'Application' estende' ContextWrapper' anche. – tynn

risposta

6

Direi (e potrei sbagliarmi) che nello scenario (e nel contesto) che hai presentato potrebbe non fare la differenza. getApplicationContext().getFilesDir() avrebbe potuto essere utilizzato con la stessa facilità.

Tuttavia, credo che ContextWrapper potrebbe essere utile in altri scenari. Da quello che ho capito, questo è il modello dell'adattatore. Si consiglia di fornire un comportamento diverso solo per alcuni metodi, mentre tutti gli altri proxy al riferimento contesto originale si passa

Dai un'occhiata a questo pezzo di codice da RemoteViews:.

// 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(); 
    } 
}; 
Problemi correlati