没有WindowManager.LayoutParams.TYPE_PHONE的粘性叠加

Joh*_*nha 8 java android kotlin

粘性是指不会因调用启动器意图(intent.addCategory(Intent.CATEGORY_HOME)而关闭的窗口。

以前是通过完成此操作的WindowManager.LayoutParams.TYPE_PHONE,但是现在不建议使用此类型,并且会在api 28上引发异常:

WindowManager $ BadTokenException ...窗口类型2002的权限被拒绝

由于Facebook的Messenger在其聊天窗口“ Heads”中进行了这种行为,因此仍然可能会发生这种行为,这是基于这样的假设:由于Facebook已预先安装在许多rom上,因此没有获得系统应用程序许可。

使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY不起作用(即,按下主页按钮也会隐藏覆盖窗口)。

编辑:问题是当用户单击主屏幕按钮/调用启动器意图时,如何具有不被删除的覆盖窗口。并非如此TYPE_APPLICATION_OVERLAY,这是事实,TYPE_PHONE但已过时。

编辑2:显然,这确实对某些人有用,这是我正在运行的代码:

class MyClass {

    var params: WindowManager.LayoutParams = WindowManager.LayoutParams(
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
            else WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG,
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT
    ).apply {
        windowAnimations = android.R.style.Animation_Dialog
        gravity = Gravity.CENTER or Gravity.CENTER
        x = 0
        y = 0
    }
    var windowManager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager

    init {
        val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        rootView = layoutInflater.inflate(R.layout.view_overlay, null)
        windowManager.addView(rootView, params)
    }

}

Run Code Online (Sandbox Code Playgroud)

Joh*_*nha 0

解决方案:不要直接将覆盖层扩展至其他应用程序之上。

通常,使用TYPE_APPLICATION_OVERLAYstill 的行为为TYPE_PHONE,我的情况的问题是,windowManager.addView(rootView, params)当另一个应用程序的活动位于前台时,我正在显示我的视图 ( ),并且 Android 会将视图附加到当前前台活动,因此当用户退出该活动时(例如,通过按主页按钮),系统还会从我的应用程序中删除覆盖层。对我来说,解决方案非常具体,我没有通用的解决方案,但这些信息应该可以帮助人们找到一个解决方案。