【Android基础】多屏开发

本文介绍了Android多屏开发的两种方式
车载Android开发和手机端的一个重大区别之一,就是车载Android设备通常拥有多个屏幕,比如一个主屏幕和一个副屏幕。在手机端通常只需要一个屏幕,但是在车载Android开发中,我们很多时候需要同时处理多个屏幕。
例如现在相当一部分的新能源车拥有主副驾两块大屏幕,主驾显示的界面为导航和车辆状态等,副驾屏幕用来显示一些娱乐app的流媒体等。甚至很多车企,还会有吸顶屏幕给后排乘客使用。
本文将介绍Android多屏开发主流的两种实现方式:Presentation和Activity。以下两种方式默认层级场景下,无系统权限的app也可以使用。
多屏设备的获取
首先,我们需要获取到多屏设备的信息,包括屏幕的数量、屏幕的尺寸、屏幕的方向等。
在Android中,我们可以通过DisplayManager来获取到多屏设备的信息。
fun getConnectedScreenIds(context: Context): List<Int> {
val displayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.displays
val screenIds = mutableListOf<Int>()
for (display in displays) {
screenIds.add(display.displayId)
display.name
infoLog("displayId = ${display.displayId}, name = ${display.name}")
}
return screenIds
}
其中,displayId是屏幕的唯一标识符,displayName是屏幕的名称。
其中display.getSize方法已经废弃,改为采用windowmanager中获取密度的方法来获取尺寸。
每次开关机之后,,displayId有可能不是固定的,主要看系统厂商是否对多屏的id进行了重置。
Presentation
Presentation是Android提供的一种用于显示UI的类,它可以在一个单独的窗口中显示UI。
Presentation继承自Dialog类,因此它也可以设置窗口的属性,比如窗口的大小、窗口的位置等。
设置Presentation时,需要传入一个Context,一个Display对象,以确定Presentation的显示位置。然后在onCreate方法中设置UI即可。
class MyPresentation(context: Context, display: Display) : Presentation(context, display) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.presentation)
}
}
创建实例,调用show方法。同时,我们也可以精细地定义其显示层级,显示大小,以及是否可以点击外部取消。
val displayManager =
this@MainActivity.getSystemService(DISPLAY_SERVICE) as DisplayManager
val display = displayManager.getDisplay(5)
val presentation = MyPresentation(this@MainActivity, display)
presentation.setCancelable(false)
presentation.show()
Activity
第二种方案可以直接使用Activity来实现多屏开发。
使用到了ActivityOptions类,官方定义为,其是一个用于构建一个选项Bundle的辅助类,该Bundle可与Context.startActivity(Intent, Bundle)及相关方法一起使用。
我们可以利用它来定义转场动画等关于显示的很多参数。这里用到了其指定displayid来显示的功能。
fun startPassengerActivity() {
val intent = Intent().apply {
setComponent(ComponentName("com.stephen.redfindemo", "com.stephen.redfindemo.PassengerActivity"))
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
}
val displayId = 5;
val options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(displayId);
try {
this.startActivity(intent, options.toBundle());
} catch (e: Exception) {
e.printStackTrace()
}
}