开启全局的悬浮窗(即覆盖在所有Activity上的悬浮窗)需要使用Application的Window,即使用Application Context获取WindowManager
WindowManager manager = (WindowManager) applicationContext.getSystemService(WINDOW_SERVICE);
如果使用Activity Context获取WindowManager,则悬浮窗只能显示在当前Activity
WindowManager manager = (WindowManager) activityContext.getSystemService(WINDOW_SERVICE);
申请权限方式开启悬浮窗:
WindowManager manager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
TextView textView = new TextView(MainActivity.this);
textView.setText("悬浮窗测试");
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
PixelFormat.TRANSLUCENT
| WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW);
manager.addView(textView, lp);
添加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
不需权限开启悬浮窗:
将上面代码中的WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
改成WindowManager.LayoutParams.TYPE_TOAST
即可
WindowManager manager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
TextView textView = new TextView(MainActivity.this);
textView.setText("悬浮窗测试");
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_TOAST,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
PixelFormat.TRANSLUCENT
| WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW);
manager.addView(textView, lp);