WindowManagerシリーズ(二)ActivityにおけるmBaseとその初期化タイミング

1555 ワード

Android 28ソースによると
一.Activityでの初期化位置(Activityのattachメソッド)
mbaseこのメンバー変数はActivityで非常に重要なメンバー変数であり、定義されています.
ContextWrapper , , Context 

では、付与のタイミングはどこにあるのでしょうか.
sourceInsight都検索機能により,合計2つの付与方法しかないことが分かった.
最初の割り当て方法
  public ContextWrapper(Context base) {
        mBase = base;
    }

この方法は,意味のない付与を発見する場所を検索することによって発見される.
2つ目の方法しか残っていません
    /**
     * 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;
    }

このメソッドの「attachBaseContext」をactivityで呼び出す場所は1つだけです.
Activityのattachメソッド.
すなわちactivityの場合,そのmbaseはattach法で初期化される.
 
二呼び出しattchメソッドの位置(Activity ThreadのperformLauncherActivity)
では、誰がActivityのattachメソッドを呼び出してmBaseを伝えたのでしょうか.
引き続きsourceInsightの検索機能を使用すると、activityを呼び出すattachメソッドが2つあることがわかります.
Instrumentationの1つはunittestのためです.
検索可能な2つの呼び出し(newActivity)にはシステム的な意味はありません
----------------------------------------------------------------------------------------------------
そこでattchメソッドの実際の呼び出し位置、すなわちActivity Threadの
performLauncherActivityメソッド
上のソースコードを見るとmBaseはContextImplオブジェクトであることがわかります