web-dev-qa-db-ja.com

attachBaseContextの役割は何ですか?

AndroidでattachBaseContextを使用する理由について混乱しています。誰かが私に同じ意味を説明できたら、とても助かります。

7
harsh sidana

attachBaseContextクラスのContextWrapper関数は、コンテキストが1回だけアタッチされることを確認しています。 ContextThemeWrapperは、Android:themeファイルでAndroidManifest.xmlとして定義されているアプリケーションまたはアクティビティのテーマを適用します。アプリケーションとサービスはどちらもテーマを必要としないため、ContextWrapperから直接テーマを継承します。アクティビティの作成中、アプリケーションとサービスが開始され、毎回新しいContextImplオブジェクトが作成され、Contextに関数が実装されます。

public class ContextWrapper extends Context {
    Context mBase;

    public ContextWrapper(Context base) {
        mBase = base;
    }

    /**
     * Set the base context for this ContextWrapper.  All calls will then be
     * delegated to the base context.  Throws
     * IllegalStateException if a base context has already been set.
     * 
     * @param base The new base context for this wrapper.
     */
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }

}

詳細はこちらをご覧ください this。

6
Hemant Parmar

ContextWrapperクラスは、任意のコンテキスト(アプリケーションコンテキスト、アクティビティコンテキスト、またはベースコンテキスト)をそれを妨げることなく元のコンテキスト。以下の例を考えてみましょう:

_override fun attachBaseContext(newBase: Context?) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase))
}  
_

ここで、newBaseは、CalligraphyContextWrapperクラスのインスタンスを返すwrapクラスのContextWrapperメソッドによってラップされた元のコンテキストです。ここで、変更されたコンテキストは、super.attachBaseContext()を呼び出すことにより、Activityの間接スーパークラスであるContextWrapperに渡されます。これで、書道依存関係のコンテキストだけでなく、元のコンテキストにもアクセスできます。
基本的に、現在のアクティビティ、アプリケーション、またはサービスで他のコンテキストを利用したい場合は、attachBaseContextメソッドをオーバーライドします。
PS:
書道は、カスタムフォントを取得するための依存関係です 書道
これをチェックして、コンテキストの詳細を確認してください コンテキストの詳細
attachBaseContextに関する公式ドキュメントは完全ではありませんが、それに関する暫定的なアイデアが得られます。 ContextWrapper

3
Neeraj Sewani