Зачем использовать ContextWrapper непосредственно в Activity вместо имплицированного контекста из этого "

Просматривая некоторые якобы «хорошие» источники источников, чтобы узнать подробности и трюки обработки контекста в Android, я столкнулся с одним шаблоном, который я не понимаю.

В чем преимущество использования ContextWrapper, когда вы могли одинаково хорошо использовать неявный контекст?

Например, зачем использовать следующее в методе активности (определенном непосредственно в классе Activity)

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

Вместо того, чтобы просто

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

Хотя getFilesDir () определен в классе ContextWrapper, Activity все равно является подклассом ContextWrapper, так что вы все равно имеете прямой доступ к этому методу.

Итак, какая потенциальная проблема (которую я не вижу) делает этот дополнительный адрес сложности?

Solutions Collecting From Web of "Зачем использовать ContextWrapper непосредственно в Activity вместо имплицированного контекста из этого ""

Я бы сказал (и, может быть, ошибаюсь), что в сценарии (и контексте), который вы представили, может не повлиять. getApplicationContext().getFilesDir() можно было использовать так же легко.

Тем не менее, я считаю, что ContextWrapper может быть полезен в других сценариях. Насколько я понимаю, это шаблон адаптера. Возможно, вы захотите предоставить другое поведение только определенным методам при проксировании всех остальных исходной ссылки на контекст, с которой вы проходите.

RemoteViews этот фрагмент кода из 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(); } };