V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Djangoogle
V2EX  ›  Android

Android app(Service)如何在后台随时随地弹出/关闭悬浮窗?

  •  
  •   Djangoogle · 2020-10-21 15:38:46 +08:00 · 8939 次点击
    这是一个创建于 1504 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求

    语音唤醒后在系统任意界面(应用)弹出悬浮窗(定制设备,非手机)。

    问题

    进程在前台时没问题,悬浮窗可以开关,进程转到后台以后就不行,即栈顶是其他应用的时候,悬浮窗弹不出,回到自己 app 查看,发现悬浮窗只显示在自己的 app 里面,无法在最顶层绘制。

    失败尝试

    ( x )打开前台服务

    ( x )在打开其他应用前先打开悬浮窗,然后根据唤醒状态改变透明度

    ( x )分别使用 EventBus/Handler/Thread+Looper 进行尝试

    ( x )分别使用 Dialog/WindowManager/开源控件进行尝试

    5.0/6.0/8.0 系统试了都不行,哪位大佬知道这问题怎么解决,能提供调试的思路也好,谢谢

    代码

    mView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.float_window, null);
    mWindowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
    mLayoutParams = new WindowManager.LayoutParams();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    	mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
    	mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
    }
    mLayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
    mLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
    mLayoutParams.x = 30;
    mLayoutParams.y = 30;
    mLayoutParams.gravity = Gravity.START | Gravity.BOTTOM;
    mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
    mLayoutParams.format = PixelFormat.TRANSLUCENT;
    mWindowManager.addView(mView, mLayoutParams);
    
    5 条回复    2020-12-10 17:04:33 +08:00
    codehz
        1
    codehz  
       2020-10-21 16:21:26 +08:00
    SYSTEM_ALERT_WINDOW 权限给了吗,定制设备的话,放 vendor 里是直接默认授权的(但是也得在清单里写
    l4mbda
        2
    l4mbda  
       2020-10-21 16:23:20 +08:00
    用 TYPE_APPLICATION_OVERLAY 应该没问题,建议看下测试机系统的权限管理中的悬浮窗权限。
    m30102
        3
    m30102  
       2020-10-28 23:52:23 +08:00
    骚操作试一下? 使用通知栏和 accessbilityservice 。 发送通知,自动点击通知,让 app 进前台。
    evitceted
        4
    evitceted  
       2020-10-30 13:52:18 +08:00
    改下 toast
    Djangoogle
        5
    Djangoogle  
    OP
       2020-12-10 17:04:33 +08:00
    已解决,LiveData/LifeCycle 绑定了生命周期,应用到后台代码就不执行了,所以语音唤醒后弹窗弹不出来,尴尬~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1136 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:56 · PVG 06:56 · LAX 14:56 · JFK 17:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.