Android中Window

Window的属性
Window的属性,常用的选项:

FLAG_NOT_FOCUSABLE

Window不需要获取焦点,也不需要接收各种输入事件(收不到Back键的事件),此标记会同时启用FLAG_NOT_TOUCH_MODEAL,最终事件会直接传递给下层的具有焦点的Window。

FLAG_NOT_TOUCH_MODEAL

收不到触屏事件,不会拦截其他Window的单击事件,一般情况下都需要开启

FLAG_SHOW_WHEN_LOCKED
可让Window显示在锁屏的界面上
版本变动
在Android众多版本的迭代中,其实悬浮窗也有比较多的变化,所以我们在使用中还要针对情况来进行相应的适配。在5.1之前,大多数手机系统里只有声明了<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>权限有就可以在app中弹出悬浮窗,除了国内部分厂商手机如:小米、魅族等定制系统中处理了悬浮窗权限要开关。我们日常开发中,比较常用到的类型有:

WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY

没有实体,不会响应事件,无法进行交互,但可悬浮在锁屏面板

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

可以接收事件

WindowManager.LayoutParams.TYPE_TOAST

在4.4以下无法接收事件,在4.4到7.0以下可以不加权限声明也能弹出悬浮窗在应用之上,在7.0及以上系统填补了不加权限声明的漏洞,在8.0中不能常显示,像正常Toast一样有显示的时间限制

WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

8.0上指定开发者使用悬浮窗唯一的类型,其它类型都会报崩溃
PS

想要在应用内显示在所以Activity之上设置type=TYPE_APPLICATION 如果传入的Context(必须是Activity) 不是当前Active的Activity也是不能正常show出来的。现在比较好的方案是在基类Activity中处理需要展示同一业务的Window

demo
 mWm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
        Context context = activity;
        mWindowView = View.inflate(context, R.layout.xxx, null);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams();

        params.type = WindowManager.LayoutParams.TYPE_APPLICATION;
        params.format = PixelFormat.TRANSLUCENT;
        mWm.addView(mWindowView, params);

参考-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值