注意:
1. 需要Context上下文,在绝大多数非原生系统上,context上下文会影响悬浮窗的显示范围。在MIUI和华为等国产系统上,使用Activity的Context只能显示在Activity里,一旦后台就看不见了。所以你的悬浮窗需要后台显示,就一定要使用getApplicationContext()。
(用Activity的上下文,窗口就隶属于Activity,有些情况退出当前活动窗口消失,有时不消失,最好的办法就是在活动生命周期中控制移除窗口,使用getApplicationContext上下文,窗口隶属于启动它的应用程序所在进程,这种情况只要app不被杀死,就可以看到窗口)
2. 在大于等于23版本下编译,悬浮窗权限默认是关闭没有权限,然儿在小于23版本下编译悬浮窗权限是开启有权限的。
3. 当你需要一个后台悬浮窗时,_type这个参数得注意和了解一下,推荐使用TYPE_TOAST(该属性不需要开启权限都可以显示悬浮窗口,只是相关的对象属性无法正常使用)
TYPE_TOAST :
`优点` : 无需开启悬浮窗权限,`缺点`:API < 19 时无法处理触控操作
TYPE_SYSTEM_ALERT :
`缺点` 需要开启悬浮窗权限
4. addView这步才回调用权限,这个使用可以使用try catch捕捉异常,提示用户自己去打开即可
public void showFloatView(){
if (mWindowManager == null && mFloatView == null) {
return;
}
try {
if (Build.VERSION.SDK_INT >= 23) {
if (Settings.canDrawOverlays(mContext)) {
mWindowManager.addView(mFloatView, wmParams);
}else{
Toast.makeText(mContext, "悬浮权限未打开,请到应用设置中打开", Toast.LENGTH_SHORT).show();
}
}else{
mWindowManager.addView(mFloatView, wmParams);
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(mContext, "悬浮权限未打开,请到应用设置中打开", Toast.LENGTH_SHORT).show();
}
}
5.应用的悬浮权限没有打开,拖动等属性失效,视图也会失效,手动打开权限又恢复正常
权限:android.permission.SYSTEM_ALERT_WINDOW
注意:
1.该权限必须配置了,才会在应用管理中出现可以选择的按钮
2.服务对象需要在清单文件声明,否则启动服务无反应
开发案例:
悬浮窗口弹起入口:
case R.id.iv_video_change://悬浮视频
if (PermissionCheckUntil.getAppOps(context)) {
Intent intent;
//启动服务显示悬浮窗口
intent = new Intent(context, FloatVideoService.class);
context.startService(intent);
//跳回视频界面前的活动
int stackSize = ActivityStack.getInstance().getStack().size();
if (stackSize > 1) {