Androidのウィンドウ管理のAndroid GWES 1基本的なアーキテクチャ原則は、Androidのウィンドウ管理は、C / Sモデルです。 Androidのウィンドウは、トップレベルおよびその他のトップウィンドウの概念で表されます。
メインビューはWindowManagerに追加され、WMはこのメインビューに対応するためにWindowStateを使用します。
アクティビティがLaunchActivityを実行するとき、アクティビティはLaunchActivityを使用する。.attach()Pho newindowメイン・ウィンドウを作成する。
このメイン・ウィンドウの作成は重要なポイントではない。,
WindowManagerにメインウィンドウのdecorViewを追加する。
onCreate()@UserActivity.java >
setContentView()@Activity.java >
mWindow.setContentView() >
setContentView()@PhoneWindow.java >
installDecor():
generateDecor() --> DecorView:ViewGroup
generateLayout() --> screen_simple.xml:id:content (FrameLayout)
decor.addView( screen_simple.xml )
handleLaunchActivity()@ActivityThread.java >
handleResumeActivity()@ActivityThread.java > ...
addView(decor)@WindowManagerImpl.java >
root = new ViewRoot();
getWindowSession() --> sWindowSession --> IWindowSession
mWindow = new W() --> IWindow
root.setView(decor)
sWindowSession.add(mWindow...) mWindowを渡す.asBinder()サーバーをパラメータとして呼び出す
decor.assignParent(root);
{ IWindow: Window Manager ---IWindow--> Client
API back to a client window that the Window Manager uses to inform it of interesting things happening. }
{ IWindowSession: Client ---IWindowSession--> Window Manager }
2.2 フォーカス・パス いわゆるフォーカス・パスとは、KeyEvent の受け渡し経路のことです。一般的に、KeyEvent は、メインループ内のメインView からフォーカスView へ、View のフォーカスレコード関係を通して渡されます。例えば、下図のように View22 がフォーカスで、最上位の View から mFcous のリレーションシップチェーンを通じて形成される経路がフォーカス経路です。
2.3 ViewRoot、Window Manager プロキシ ViewRoot、Window Manager の中核は、ViewRoot が IWindowSession を介して Window Manager にウィンドウを追加するために使用する IWindowSession と、Window Manager が Window Manager にメッセージを配信するために使用する IWindow です。これは、Window ManagerがクライアントのViewRootにメッセージを配布するチャネルです。AIDL インターフェイスを使用したプロセス間通信。
ViewRootは実際にはハンドラです。ViewRootはメインViewがWindowsMangerと通信するためのブリッジを確立します。ViewRootは本質的にハンドラです。ハンドラの基本的な機能はコールバックを処理し、メッセージを送信することです。
WindowManagerImplを取得するためにgetSystemServiceを使用するアクティビティ、WindowManagerImplインスタンスの確立、つまりWindow Managerサービスエージェント:
wm=context.getSystemService(Context.WINDOW_SERVICE);とWMServiceにウィンドウを追加するには、wm.addviewを呼び出します。
このプロセスはクライアント側でどのような管理フレームワークを作成し、このセッションはどのように動作しますか?Window Manager Proxyでは、View、Layout、ViewRootの3つの対応する関係テーブルを確立しました。ViewRootを構築するセッションを開き、IWindowSessionを使用してセッションコンテキストを確立します。
4 Window Manager Service この Window Manager Service の研究は、FocusWindow、メッセージング システムに限定されています。他の部分については、後の特別なセクションで説明します。
Window Managerが管理するウィンドウは、アプリケーションのトップレベルウィンドウであり、メインウィンドウと呼ばれるウィンドウの概念を参照しています。なぜメインウィンドウをサービス側に置いて管理する必要があるのでしょうか?なぜクライアント側ではないのでしょうか?メインウィンドウを一緒に配置する理由は、Z順序を計算し、アプリケーションの状態に応じてアプリケーションのウィンドウを表示・非表示するためです。Androidの設計者は、ウィンドウシステムを設計する際に、まずこのことを考慮しなければならないと思います:
ウィンドウのZ順序の管理
アクティブなウィンドウの計算と変更の通知
ウィンドウの帰属
入力メソッドの管理
ウィンドウサービスは一般的に以下の機能を実装しています。
Z順メンテナンス機能
入力メソッド管理
ウィンドウの追加/削除
レイヤアウト
トークン管理、AppToken
アクティブウィンドウ管理
アクティブアプリケーション管理
トランジション・アニメーション
システムメッセージ収集スレッド
システムメッセージ配信スレッド
サービス側のウィンドウオブジェクトはWindowStateと呼ばれます。サービスはmWindowというウィンドウのZオーダー配列を保持しています。
WindowStateは、クライアントのIWindowインスタンスを記録するmClientと呼ばれるメンバ変数を持って、IWindowインタフェースのインスタンスを介して、サービスは、クライアントの情報にアクセスすることができますIWindowにサービスは、ビューブリッジに接続されていると。
FocusWindowアクティブウィンドウを計算する方法?
基本的な原理は、フォアグラウンドアプリケーションを見つけることであり、Z順序でFousActivityに属するメインウィンドウを見つけるために、このウィンドウは、計算されたフォーカスウィンドウです。
なぜトークンなのですか?
アプリケーションはそれ自身のウィンドウを管理する必要があり、あるアクティビティに属するウィンドウを特定するために、Andoidの設計者はAppTokenという概念を提唱しました。アプリケーションのすべてのウィンドウの表示と非表示。
システム・メッセージの収集と処理
以下のセクションでは、KeyQを特別なメッセージキューとして使用するServiceにおけるシステムメッセージの収集と配信パターンに焦点を当てます。
キーイベント
キーイベント
トラックボールイベント
システムには2つのスレッドがあります:
KeyQスレッドは、Navite関数のreadEventを通じてデバイスをポーリングし、読み取り結果をKeyQキューに格納します。
システムディスパッチャはKeyQメッセージキューで待機し、メッセージキューからメッセージを受け取ると、mClientディストリビューション関数を介してクライアントに渡します。




