实现Android利用外悬浮窗的过程能够分为以下步骤:
  
  获取悬浮窗权限:在AndroidManifest.xml文件中增加SYSTEM_ALERT_WINDOW权限,以容许利用在其余利用下层显示悬浮窗。
  
  创立悬浮窗布局:创立一个布局文件,用于定义悬浮窗的款式和内容。
  
  创立悬浮窗服务:创立一个Service类,用于治理悬浮窗的生命周期和操作。
  
  增加显示悬浮窗的代码:在Service类中的onCreate办法中,通过WindowManager.LayoutParams参数设置悬浮窗的显示地位和属性,并将悬浮窗布局增加到WindowManager中进行显示。
  
  增加悬浮窗的触摸事件处理:在Service类中的onCreate办法中,为悬浮窗布局设置触摸事件监听器,以实现拖拽悬浮窗的性能。
  
  增加悬浮窗的点击事件处理:在Service类中的onCreate办法中,为悬浮窗布局设置点击事件监听器,以实现点击悬浮窗进行相应操作的性能。
  
  上面是具体的每一步须要做的操作和代码示例:
  
  第一步:获取悬浮窗权限
  
  在AndroidManifest.xml文件中增加以下代码: 
 

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

  
  第二步:创立悬浮窗布局
  
  创立一个布局文件,例如float_window.xml,用于定义悬浮窗的款式和内容。能够应用LinearLayout或者RelativeLayout等布局容器,依据须要增加相应的控件和款式。
  
  第三步:创立悬浮窗服务
  
  创立一个继承自Service的类,例如FloatWindowService,用于治理悬浮窗的生命周期和操作。

public class FloatWindowService extends Service {    // 实现Service的相干办法}

  
  第四步:增加显示悬浮窗的代码
  
  在FloatWindowService的onCreate办法中,通过WindowManager.LayoutParams参数设置悬浮窗的显示地位和属性,并将悬浮窗布局增加到WindowManager中进行显示。

@Overridepublic void onCreate() {    super.onCreate();        // 创立悬浮窗布局    View floatView = LayoutInflater.from(this).inflate(R.layout.float_window, null);        // 设置悬浮窗参数    WindowManager.LayoutParams params = new WindowManager.LayoutParams();    params.width = WindowManager.LayoutParams.WRAP_CONTENT;    params.height = WindowManager.LayoutParams.WRAP_CONTENT;    params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;    params.format = PixelFormat.TRANSLUCENT;        // 获取WindowManager    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);        // 增加悬浮窗布局到WindowManager    windowManager.addView(floatView, params);}

  第五步:增加悬浮窗的触摸事件处理
  
  在FloatWindowService的onCreate办法中,为悬浮窗布局设置触摸事件监听器,以实现拖拽悬浮窗的性能。

@Overridepublic void onCreate() {    super.onCreate();        // ...        // 设置悬浮窗触摸事件监听器    floatView.setOnTouchListener(new View.OnTouchListener() {        private int lastX;        private int lastY;        private int paramX;        private int paramY;                @Override        public boolean onTouch(View v, MotionEvent event) {            switch (event.getAction()) {                case MotionEvent.ACTION_DOWN:                    lastX = (int) event.getRawX();                    lastY = (int) event.getRawY();                    paramX = params.x;                    paramY = params.y;                    break;                case MotionEvent.ACTION_MOVE:                    int dx = (int) event.getRawX() - lastX;                    int dy = (int) event.getRawY() - lastY;                    params.x = paramX + dx;                    params.y = paramY + dy;                    windowManager.updateViewLayout(floatView, params);                    break;                case MotionEvent.ACTION_UP:                    // 解决点击事件                    break;            }            return true;        }    });}

  
  第六步:增加悬浮窗的点击事件处理
  
  在FloatWindowService的onCreate办法中,为悬浮窗布局设置点击事件监听器,以实现点击悬浮窗进行相应操作的性能。