私はそれをグーグルで試してみましたが、直接および/または明確な答えはありません。
開発者ウェブサイト の定義も明確ではありません:
ウィンドウマネージャーと通信するためにアプリが使用するインターフェイス。
Context.getSystemService(Context.WINDOW_SERVICE)
を使用して、これらのいずれかを取得します。
普通の6年生の英語の誰かがそれが何であるかを説明できますか?
そして、それを使用して、一方から他方に移動しても、いくつかのアクティビティを介して残るフローティングオブジェクトを作成するにはどうすればよいですか?
Android WindowManagerはシステムサービスであり、zオーダーのウィンドウのリスト、どのウィンドウが表示され、どのように画面上にレイアウトされるかを管理します。アプリを開いたり閉じたり、画面を回転させたりするときに、ウィンドウの切り替えとアニメーションを実行します。
すべてのアクティビティには、画面にコンテンツを表示するために使用されるウィンドウがあります。アクティビティで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"/>
Android api version> 23、Android.permission.SYSTEM_ALERT_WINDOW
ランタイムを要求する必要があります。また、TYPE_SYSTEM_ERROR
といくつかのタイプはAndroid api 26で廃止されました。ここに方法があります
public void showWindowManager() {
if (requestPermission()) {
return;
}
WindowManager.LayoutParams p =
new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
Build.VERSION.SDK_INT > Build.VERSION_CODES.O
? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
: WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater layoutInflater =
(LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
final View popupView = layoutInflater.inflate(R.layout.window_manager_layout, null);
windowManager.addView(popupView, p);
// dismiss windowManager after 3s
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
windowManager.removeView(popupView);
}
}, 3000);
}
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (Settings.canDrawOverlays(this)) {
showWindowManager();
}
}
}
public boolean requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
return true;
}
}
return false;
}
ウィンドウマネージャは画面を整理し、どこに何を表示し、どのように階層化するかを処理します。
フローティングオブジェクトの素敵なオープンソースの例を次に示します。 浮動オブジェクトの例