blog

Androidマルチウィンドウ管理徹底分析

Androidウィンドウ管理のAndroid GWES 1基本的なアーキテクチャ原則、Androidウィンドウ管理は、C / Sモデルです。 Androidウィンドウは、Top Levelと他のトップ...

Apr 28, 2014 · 4 min. read
シェア

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ディストリビューション関数を介してクライアントに渡します。

Read next

Win8.1:マイクロソフトが正しかったが、他を軽視した6つの点

しかし、このWindows Phone用の革新的なメトロ・ダイナミック・インターフェイスは、特にユーザビリティ・デザインのカスタマイズの欠如について、多くの疑問や議論を呼びました。そのため、多くのユーザーはマイクロソフトがコードネームWindows Blueと呼ばれるWindows 8.1の更新版でこれらの機能を修正・改善することを期待し、実際にマイクロソフトはそれを実行しました。

Apr 26, 2014 · 4 min read