Androidブラウザのマルチウィンドウスキームの詳細

2633 ワード

私たちのAndroidプラットフォームは1つまたは複数のActivityで構成されています.各Activityには1つまたは複数のViewで構成されています.だから、インタフェースを表示したいときは、まずActivityを確立し、すべての操作をActivityで実現するか、DialogまたはToastを考えます.この方式はもちろん簡単ですが、場合によっては簡単な表示だけを要求します.Activityでは明らかに余計ですが、この時、私たちはどのように処理しますか.
Androidの1つの応用は下層でもlinuxの1つのプロセスであるが,上層ではプロセスの概念を弱め,Activityというインタラクションを抽象化している.コードが直接制御するのはActivityであり,ユーザのインタラクションもActivityである.Activityは,ユーザのインタラクションの観点から抽象化されたオブジェクトであり,概念と使用上プロセスから隔離されている.プロセスは1つの養子縁組の機能に似ており、1つのプロセスに複数のActivityを持つことができ、自分の現在のアプリケーションのActivityを養子縁組するだけでなく、他のインストールパッケージがプロセスに指定したActivityを養子縁組することもでき、Activityは破棄され、プロセスは破棄されません(システムの必要性やコードがプロセスを強制的に殺さない限り).
従来、Android全体のウィンドウメカニズムはWindowManagerと呼ばれており、このインタフェースはviewを画面に追加したり、画面からviewを削除したりすることができます.向いているオブジェクトの一端はスクリーンで、もう一端はViewで、私たちの以前のActivityやDialogなどを直接無視しています.実は私达のActivityあるいはDiologの底层の実现もWindowManagerを通じて(通って)、このWindowManagerは全局的で、全体のシステムはこの唯一のものです.ビューを表示する最下位です.
簡単なコードを書く:Javaコード
 
  
WindowManager mWm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);   
Button view = new Button(this);   
view.setText("window manager test!");   
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();   
mWm.addView(view, mParams);  

一般的にandroidの開発を始めたばかりの頃は、ビューのコンストラクション関数でgetWidth()とgetHeight()を取得するというエラーが発生します.
ビューオブジェクトが作成されるとandroidはそのサイズを知らないのでgetWidth()とgetHeight()は0を返します.
本当の大きさはレイアウトを計算するときに計算されるので、onDraw()で長さと幅を得ることができるという興味深いことがわかります.
WindowManagerを使用したサスペンションウィンドウ
 
  
       WindowManager.LayoutParams params;

        params = new WindowManager.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,//TYPE_APPLICATION,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.TOP;
        manager.addView(tmpView, params); 

 
懸濁ウィンドウに追加する必要があるViewをウィンドウに追加できます.
 
  
 if(view.getParent==null)// view , WindowManager
        wManager.addView(view,wmParams);

ただし、viewは、懸濁ウィンドウに配置する必要があるビューコンポーネントです.
WindowManagerから削除する場合は、次の文を実行します.
 
  
        if(view.getParent()!=null)
        wManager.removeView(view);
 
Androidでは、上記の方法で複数のウィンドウを追加できます.複数のウィンドウで発生する問題:
2.ライフサイクルを適用する問題他のアプリケーションがブラウザのメインActivityの前に表示されると、ブラウザのサブウィンドウが何個ポップアップされても、ブラウザのライフサイクルはonPause状態になります.