在Android中,使用WindowManager创建系统悬浮窗需要以下几个步骤:

1.权限声明:在AndroidManifest.xml中声明SYSTEM_ALERT_WINDOW权限。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

2.检查权限:从Android 6.0 (API级别23) 开始,你需要在运行时请求用户授权。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!Settings.canDrawOverlays(context)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()));
        startActivityForResult(intent, REQUEST_CODE);
    }
}

3.创建悬浮窗:使用WindowManagerLayoutParams来定义悬浮窗的布局。

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams params = 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_PHONE,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);

View floatingView = LayoutInflater.from(this).inflate(R.layout.floating_view_layout, null);
windowManager.addView(floatingView, params);

4.处理悬浮窗的交互:例如,让悬浮窗能够拖动。

floatingView.setOnTouchListener(new View.OnTouchListener() {
    private int initialX, initialY;
    private float initialTouchX, initialTouchY;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                initialX = params.x;
                initialY = params.y;
                initialTouchX = event.getRawX();
                initialTouchY = event.getRawY();
                return true;
            case MotionEvent.ACTION_MOVE:
                params.x = initialX + (int) (event.getRawX() - initialTouchX);
                params.y = initialY + (int) (event.getRawY() - initialTouchY);
                windowManager.updateViewLayout(floatingView, params);
                return true;
        }
        return false;
    }
});

5.移除悬浮窗:当不再需要时,通过WindowManager.removeView()来移除悬浮窗。

if (floatingView != null) {
    windowManager.removeView(floatingView);
}