68

グーグルで検索してみましたが、直接的および/または明確な答えはありません。

開発者の Web サイトの定義も明確ではありません。

アプリがウィンドウ マネージャーと対話するために使用するインターフェイス。これらのいずれかを取得するために使用 Context.getSystemService(Context.WINDOW_SERVICE)します。

6 年生の平易な英語を知っている人は、それが何であるかを説明できますか?

そして、それを使用して、あるアクティビティから別のアクティビティに移動したにもかかわらず、複数のアクティビティを介して残るフローティング オブジェクトを作成するにはどうすればよいですか?

4

3 に答える 3

150

Android WindowManager はシステム サービスであり、z 順のウィンドウ リスト、表示されるウィンドウ、画面上でのレイアウト方法を管理します。特に、アプリの開閉や画面の回転時に、ウィンドウの遷移とアニメーションを自動的に実行します。

すべてのアクティビティには、そのコンテンツを画面に表示するために使用される Window があります。アクティビティで setContentView を呼び出すと、そのビューがアクティビティのデフォルト ウィンドウにアタッチされます。既定のウィンドウが画面いっぱいに表示されるため、アクティビティのウィンドウは他のアクティビティを隠します。WindowManager は一番上にあるウィンドウを表示します。したがって、通常はウィンドウについて心配する必要はありません。アクティビティを作成するだけで、あとは Android が処理してくれます。

ただし、画面いっぱいにならないフローティング ウィンドウを作成するなど、通常とは異なる操作を行う場合は、WindowManager を操作する必要があります。他のアプリケーションの前に表示されるフローティング ウィンドウを作成する場合、アクティビティを使用できません。これは、別のアプリがフォアグラウンドになるとアクティビティが停止し、そのウィンドウが非表示になるか破棄されるためです。代わりに、バックグラウンド サービスからウィンドウを表示する必要があります。例えば:

WindowManager.LayoutParams p = new WindowManager.LayoutParams(
    // Shrink the window to wrap the content rather than filling the screen 
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    // Display it on top of other application windows, but only for the current user
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    // Don't let it grab the input focus
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    // Make the underlying application window visible through any transparent parts
    PixelFormat.TRANSLUCENT);

// Define the position of the window within the screen
p.gravity = Gravity.TOP | Gravity.RIGHT;
p.x = 0;
p.y = 100;

WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
windowManager.addView(myView, p);

これを機能させるには、次のアクセス許可を AndroidManifest.xml に追加する必要があります。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
于 2014-03-16T20:40:29.337 に答える
2

ウィンドウマネージャーは、画面を整理し、何をどこに、どのように重ねるべきかを処理します。

これは、浮動オブジェクトのオープン ソースの優れた例です。 フローティング オブジェクトの例

于 2013-11-07T21:34:37.583 に答える