AndroidでattachBaseContextを使用する理由について混乱しています。誰かが私に同じ意味を説明できたら、とても助かります。
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。
ContextWrapperクラスは、任意のコンテキスト(アプリケーションコンテキスト、アクティビティコンテキスト、またはベースコンテキスト)をそれを妨げることなく元のコンテキスト。以下の例を考えてみましょう:
_override fun attachBaseContext(newBase: Context?) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase))
}
_
ここで、newBase
は、CalligraphyContextWrapper
クラスのインスタンスを返すwrap
クラスのContextWrapper
メソッドによってラップされた元のコンテキストです。ここで、変更されたコンテキストは、super.attachBaseContext()
を呼び出すことにより、Activityの間接スーパークラスであるContextWrapper
に渡されます。これで、書道依存関係のコンテキストだけでなく、元のコンテキストにもアクセスできます。
基本的に、現在のアクティビティ、アプリケーション、またはサービスで他のコンテキストを利用したい場合は、attachBaseContext
メソッドをオーバーライドします。
PS:
書道は、カスタムフォントを取得するための依存関係です 書道
これをチェックして、コンテキストの詳細を確認してください コンテキストの詳細attachBaseContext
に関する公式ドキュメントは完全ではありませんが、それに関する暫定的なアイデアが得られます。 ContextWrapper