Androidのウィンドウ管理システムでは、起動時にRootWindowContainerが物理ディスプレイに対応する論理表示領域を構築します。この処理はsetWindowManager()メソッド内で実行され、各DisplayオブジェクトからDisplayContentインスタンスを生成し、ルートコンテナに追加します。
void setWindowManager(WindowManagerService wm) {
final Display[] physicalDisplays = mDisplayManager.getDisplays();
for (Display display : physicalDisplays) {
DisplayContent area = new DisplayContent(display, this);
addChild(area, POSITION_BOTTOM);
if (display.getDisplayId() == Display.DEFAULT_DISPLAY) {
mPrimaryDisplay = area;
}
}
}
DisplayContentのコンストラクタでは、内部サーフェスの準備と同時に、表示領域の階層構造(Display Area Hierarchy)の構築を開始します。ここで重要なのは、configureSurfaces()がトランザクションを用いてサーフェスの再親化(reparenting)を安全に行う点です。
DisplayContent(Display display, RootWindowContainer root) {
super(root.mWindowManager, "DisplayContent", FEATURE_ROOT);
// ...
Transaction transaction = getPendingTransaction();
configureSurfaces(transaction);
// ...
}
階層構築の核心はconfigureSurfaces()内のDisplayAreaPolicy.Providerによるポリシー適用にあります。WMSはデフォルトでDefaultProviderを採用し、TaskDisplayAreaを中心とした階層を動的に生成します。このエリアはアプリケーションのActivityやウィンドウ状態(WindowState)を保持する主要なコンテナとなります。
private void configureSurfaces(Transaction transaction) {
if (mDisplayAreaPolicy == null) {
mDisplayAreaPolicy = mWmService.getDisplayAreaPolicyProvider()
.instantiate(mWmService, this, this, mInputMethodArea);
}
}
DefaultProviderのinstantiate()実装では、HierarchyBuilderを用いて論理ディスプレイのルートから下位の表示領域を体系的に構成します。具体的には、TaskDisplayAreaがデフォルトのアプリケーションタスクコンテナとして作成され、RootDisplayAreaに登録されます。この構造により、ウィンドウのZ順序、可視性、入力ルーティングなどの制御が可能になります。
static final class DefaultProvider implements DisplayAreaPolicy.Provider {
@Override
public DisplayAreaPolicy instantiate(WindowManagerService service,
DisplayContent content, RootDisplayArea root, DisplayArea.Tokens imeArea) {
TaskDisplayArea mainArea = new TaskDisplayArea(
content, service, "MainTaskArea", FEATURE_DEFAULT_TASK_CONTAINER);
HierarchyBuilder builder = new HierarchyBuilder(root);
builder.add(mainArea).build();
return new DefaultDisplayAreaPolicy(builder.getBuiltHierarchy());
}
}