問題
在Android平臺上一直都支持多屏幕設(shè)備開發(fā),使用android.app.Presentation可以快速的創(chuàng)建一個(gè)副屏顯示頁面(文檔),但是只能使用傳統(tǒng)的View布局,并不支持直接使用compose-ui,導(dǎo)致我們在開發(fā)多屏幕應(yīng)用時(shí)無法統(tǒng)一UI框架。
幸運(yùn)的是Android提供了Dialog的Compose實(shí)現(xiàn)方式,位于android.compose.ui:ui組件中的androidx.compose.ui.window.Dialog,而android.app.Presentation恰恰是繼承自Dialog的一個(gè)子類,于是可以得出一個(gè)實(shí)現(xiàn)方案,魔改出一個(gè)androidx.compose.ui.window.Presentation就可以使用了。
解決方法
- AndroidPresentation.android.kt 首先打開手機(jī)開發(fā)者選項(xiàng)->模擬輔助顯示設(shè)備->720P,1080P(雙屏)

打開后屏幕會顯示出兩個(gè)區(qū)域,這就是模擬的副屏,目前這個(gè)副屏無法提供手勢操作,最好有實(shí)體的雙屏設(shè)備來測試,比如微軟的suface duo。
使用示例
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 獲取所有的屏幕信息(主屏+副屏)
displayManagerCompat.displays.also { ownDisplayList ->
setContent { // 設(shè)置內(nèi)容
ownDisplayList.forEach { // 遍歷屏幕
if (it.displayId == Display.DEFAULT_DISPLAY) { // 是否為默認(rèn)屏幕(主屏)
composeContent(it) // 組合屏幕UI
} else {
// 使用AndroidPresentation.android.kt中定義的Presentation函數(shù)來開啟副屏的顯示
Presentation(it, onDismissRequest = {
/**副屏關(guān)閉時(shí)的回調(diào),類似Dialog*/
}) {
composeContent(it) // 組合屏幕UI
}
}
}
}
}
}
/**
* 組合屏幕UI
*/
@Composable
fun composeContent(display: Display) {
DemoTheme {
// UI內(nèi)容省略
...
...
...
}
}
運(yùn)行結(jié)果(僅供參考):

擴(kuò)展使用
android.app.Presentation的構(gòu)造方法中是可以支持傳入Service和Application作為Context來使用的。這里就無法使用我們上文中的android.app.Presentation來實(shí)現(xiàn)了,不過可以參考androidx.activity.ComponentActivity的實(shí)現(xiàn)來定制一個(gè)自己的androidx.presentation.ComponentPresentation
以下是已經(jīng)修改好的版本,僅供參考
- ComposePresentation.android.kt
-
PresentationViewModelLazy.android.kt 使用時(shí)將
ComposePresentation代替android.app.Presentation即可,具體步驟可參考:安卓Presentation
作者:Ning1994
鏈接:https://juejin.cn/post/7036995991949541413