安卓笔记-双屏异显之Presentation探索爬坑

当前开发的项目是针对双屏机进行定制开发,所以找了个时间特地了解了一下双屏的开发教程,本文仅针对本人所采用的开发方式进行记录。

屏幕的获取

看了很多大佬的教程,对于Presentation基本上都有很详细的说明,所以在这里不做更多的介绍,在开发双屏之前首先就是要确定哪一个屏幕是副屏,目前有两种方式可以获取到屏幕:

  • Media Router
  • Display Manager
    两种在网上都有很详细的教程来说明如何获取到屏幕,我用的是DisplayManager,在此也只针对DisplayManager的方式来做说明,代码如下:
var displayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
if(displayManager.displays.size >= 2){
	displayManager.displays.last()
}

在获取到displayManager后里面的displays就是所有的可使用的屏幕了,我稍微做了一个判断,如果屏幕数量大于等于2则表示当前设备有副屏,注意,根据我了解的内容,在onCreate阶段调用displaymanager的时候最好用线程或者协程阻塞0.5秒左右以保证能成功获取到display

Presentation实现

接下来就是自定义一个Presentation,代码如下:

class TestPresentation(outerContext: Context?, display: Display?) :
        Presentation(outerContext, display) {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.presentation_test)
        }
    }

传入的上下文必须是activity的上下文,全局的上下文/service的上下文/contentProvider的上下文都没有用。而且如果这个activity在做了跳转或者销毁的时候,这个Presentation就会消失,如果这个activity回到前台才会重新出现,这就很让人蛋疼了,因为这个项目的需求就是要求副屏要一直播放广告,如果每次跳转都要重新创建Presentation的话会出现闪屏的情况,看到网上对这种需求的实现方法并没有太多描述所以只能摸索一下了,很多大佬对于Presentation的描述都是“一种特别的dialog”,所以我就想如果是dialog的话那么将其设定为系统级dialog是不是可以解决这个情况,之后尝试了之后发现可行,只要在Presentation的onCreate()方法内写入以下代码:

 window?.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)

并且在Manifest里声明权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

即可,这样的话,即便应用转入后台,只要不杀死进程副屏会一直显示我想要的内容了。

你可能感兴趣的:(android,kotlin)