web-dev-qa-db-ja.com

「this」からの暗黙的なコンテキストではなく、アクティビティで直接ContextWrapperを使用する理由

Androidでコンテキスト処理の詳細とコツを学ぶために、いくつかのおそらく「良い」ソースソースを調べて、理解できない1つのパターンに何度も遭遇しました。

暗黙のコンテキストを同様にうまく使用できる場合、ContextWrapperを使用する利点は何ですか?

たとえば、アクティビティメソッド(Activityクラスで直接定義されている)で以下を使用する理由

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

ただの代わりに

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

getFilesDir()がContextWrapperクラスで定義されていても、ActivityはとにかくContextWrapperのサブクラスであるため、とにかくメソッドに直接アクセスできます。

では、この追加された複雑さは、どのような潜在的な問題(私にはわかりません)に対処しますか?

13
Johan

私はあなたが提示したシナリオ(そして文脈)では違いがないかもしれないと言います(そして私は間違っているかもしれません)。 getApplicationContext().getFilesDir()も同じように簡単に使用できます。

ただし、ContextWrapperは他のシナリオでも役立つ可能性があると思います。私が理解していることから、これはアダプターパターンです。渡した元のコンテキスト参照に他のすべてをプロキシしながら、特定のメソッドに対してのみ異なる動作を提供したい場合があります。

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