BackHandler是全局的!!!

本文介绍了一种在React Native中监听安卓设备返回键的方法,并详细解释了如何通过自定义函数`onBackAndroid`来实现对返回操作的控制,包括如何处理多页面间的回退逻辑以及在特定条件下退出应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

componentWillMount() {
        if (Platform.OS === 'android') {
            this.listener = BackHandler.addEventListener('hardwareBackPress', this.onBackAndroid);
        }
    }


    componentWillUnmount() {
        if (Platform.OS === 'android') {
            this.listener.remove('hardwareBackPress');
        }
    }


    onBackAndroid = () => {
        const navigator = this.refs.navigator;//**************************
        const routers = navigator.getCurrentRoutes();
        console.log('当前路由长度:' + routers.length);
        if (routers.length > 2) {
            navigator.pop();
            return true;//接管默认行为
        } else {
            //到了主页了
            if (this.lastBackPressed && this.lastBackPressed + 2000 >= Date.now()) {
                //最近2秒内按过back键,可以退出应用。
                return false;
            }
            this.lastBackPressed = Date.now();
            ToastAndroid.show('再按一次退出应用', ToastAndroid.SHORT);
            return true;
        }
        // return false;//默认行为


    };

备注:但是WebView需要特殊处理cangoback,也可以在WebView单独注册一个BackHandler!

package top.yogiczy.mytv.tv.ui.screensold.main.components import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable import androidx.compose.runtime.key import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import kotlinx.coroutines.launch import android.widget.Toast import android.content.Context import android.content.Intent import androidx.compose.runtime.remember import top.yogiczy.mytv.core.data.utils.Constants import top.yogiczy.mytv.core.data.utils.Logger import top.yogiczy.mytv.core.data.entities.actions.KeyDownAction import top.yogiczy.mytv.core.data.entities.channel.Channel import top.yogiczy.mytv.core.data.entities.channel.ChannelGroupList import top.yogiczy.mytv.core.data.entities.channel.ChannelGroupList.Companion.channelList import top.yogiczy.mytv.core.data.entities.channel.ChannelLine import top.yogiczy.mytv.core.data.entities.channel.ChannelList import top.yogiczy.mytv.core.data.entities.epg.Epg import top.yogiczy.mytv.core.data.entities.epg.EpgList import top.yogiczy.mytv.core.data.entities.epg.EpgList.Companion.match import top.yogiczy.mytv.core.data.entities.epg.EpgList.Companion.recentProgramme import top.yogiczy.mytv.core.data.entities.epg.EpgProgrammeReserveList import top.yogiczy.mytv.core.data.entities.iptvsource.IptvSourceList import top.yogiczy.mytv.core.data.repositories.epg.EpgRepository import top.yogiczy.mytv.core.data.repositories.iptv.IptvRepository import top.yogiczy.mytv.tv.ui.material.PopupContent import top.yogiczy.mytv.tv.ui.material.Snackbar import top.yogiczy.mytv.tv.ui.material.Visibility import top.yogiczy.mytv.tv.ui.material.popupable import top.yogiczy.mytv.tv.ui.screen.settings.SettingsSubCategories import top.yogiczy.mytv.tv.ui.screen.main.MainViewModel import top.yogiczy.mytv.tv.ui.screen.main.mainVM import top.yogiczy.mytv.tv.ui.screen.settings.SettingsViewModel import top.yogiczy.mytv.tv.ui.screen.settings.settingsVM import top.yogiczy.mytv.tv.ui.screensold.audiotracks.AudioTracksScreen import top.yogiczy.mytv.tv.ui.screensold.channel.ChannelNumberSelectScreen import top.yogiczy.mytv.tv.ui.screensold.channel.ChannelScreen import top.yogiczy.mytv.tv.ui.screensold.channel.ChannelTempScreen import top.yogiczy.mytv.tv.ui.screensold.channel.rememberChannelNumberSelectState import top.yogiczy.mytv.tv.ui.screensold.channelline.ChannelLineScreen import top.yogiczy.mytv.tv.ui.screensold.classicchannel.ClassicChannelScreen import top.yogiczy.mytv.tv.ui.screensold.datetime.DatetimeScreen import top.yogiczy.mytv.tv.ui.screensold.epg.EpgProgrammeProgressScreen import top.yogiczy.mytv.tv.ui.screensold.epg.EpgScreen import top.yogiczy.mytv.tv.ui.screensold.epgreverse.EpgReverseScreen import top.yogiczy.mytv.tv.ui.screensold.quickop.QuickOpScreen import top.yogiczy.mytv.tv.ui.screensold.subtitletracks.SubtitleTracksScreen import top.yogiczy.mytv.tv.ui.screensold.iptvsource.IptvSourceScreen import top.yogiczy.mytv.tv.ui.screensold.videoplayer.VideoPlayerScreen import top.yogiczy.mytv.tv.ui.screensold.videoplayer.player.VideoPlayer import top.yogiczy.mytv.tv.ui.screensold.videoplayer.rememberVideoPlayerState import top.yogiczy.mytv.tv.ui.screensold.videoplayercontroller.VideoPlayerControllerScreen import top.yogiczy.mytv.tv.ui.screensold.videoplayerdiaplaymode.VideoPlayerDisplayModeScreen import top.yogiczy.mytv.tv.ui.screensold.videotracks.VideoTracksScreen import top.yogiczy.mytv.tv.ui.screensold.webview.WebViewScreen import top.yogiczy.mytv.tv.ui.screensold.webview.WebViewScreen_X5 import top.yogiczy.mytv.tv.ui.utils.backHandler import top.yogiczy.mytv.tv.ui.utils.handleDragGestures import top.yogiczy.mytv.tv.ui.utils.handleKeyEvents import top.yogiczy.mytv.tv.ui.utils.Configs import top.yogiczy.mytv.tv.X5CorePreLoadService @Composable fun MainContent( modifier: Modifier = Modifier, isLoadingProvider: () -> Boolean = { false }, filteredChannelGroupListProvider: () -> ChannelGroupList = { ChannelGroupList() }, favoriteChannelListProvider: () -> ChannelList = { ChannelList() }, epgListProvider: () -> EpgList = { EpgList() }, settingsViewModel: SettingsViewModel = settingsVM, onChannelFavoriteToggle: (Channel) -> Unit = {}, toSettingsScreen: (SettingsSubCategories?) -> Unit = {}, toDashboardScreen: () -> Unit = {}, onReload: () -> Unit = {}, onBackPressed: () -> Unit = {}, ) { val isLoading = isLoadingProvider() val coroutineScope = rememberCoroutineScope() val log = remember { Logger.create("MainContent")} val videoPlayerState = rememberVideoPlayerState(defaultDisplayModeProvider = { settingsViewModel.videoPlayerDisplayMode }) val mainContentState = rememberMainContentState( videoPlayerState = videoPlayerState, channelGroupListProvider = filteredChannelGroupListProvider, favoriteChannelListProvider = favoriteChannelListProvider, ) val channelNumberSelectState = rememberChannelNumberSelectState { val idx = it.toInt() - 1 filteredChannelGroupListProvider().channelList.getOrNull(idx)?.let { channel -> mainContentState.changeCurrentChannel(channel) } } Box( modifier = modifier .popupable() .backHandler { onBackPressed() } .handleKeyEvents( onUp = { getKeyDownEvent(settingsViewModel.keyDownEventUp, settingsViewModel, mainContentState, isLoading) }, onDown = { getKeyDownEvent(settingsViewModel.keyDownEventDown, settingsViewModel, mainContentState, isLoading) }, onLeft = { getKeyDownEvent(settingsViewModel.keyDownEventLeft, settingsViewModel, mainContentState, isLoading) }, onRight = { getKeyDownEvent(settingsViewModel.keyDownEventRight, settingsViewModel, mainContentState, isLoading) }, onLongUp = { getKeyDownEvent(settingsViewModel.keyDownEventLongUp, settingsViewModel, mainContentState, isLoading) }, onSelect = { getKeyDownEvent(settingsViewModel.keyDownEventSelect, settingsViewModel, mainContentState, isLoading) }, onLongSelect = { getKeyDownEvent(settingsViewModel.keyDownEventLongSelect, settingsViewModel, mainContentState, isLoading) }, onSettings = { mainContentState.isQuickOpScreenVisible = true }, onLongLeft = { getKeyDownEvent(settingsViewModel.keyDownEventLongLeft, settingsViewModel, mainContentState, isLoading) }, onLongRight = { getKeyDownEvent(settingsViewModel.keyDownEventLongRight, settingsViewModel, mainContentState, isLoading) }, onLongDown = { getKeyDownEvent(settingsViewModel.keyDownEventLongDown, settingsViewModel, mainContentState, isLoading) }, onNumber = { channelNumberSelectState.input(it) }, ) .handleDragGestures( onSwipeDown = { getKeyDownEvent(KeyDownAction.ChangeCurrentChannelToPrev, settingsViewModel, mainContentState, isLoading) }, onSwipeUp = { getKeyDownEvent(KeyDownAction.ChangeCurrentChannelToNext, settingsViewModel, mainContentState, isLoading) }, onSwipeRight = { getKeyDownEvent(KeyDownAction.ChangeCurrentChannelLineIdxToPrev, settingsViewModel, mainContentState, isLoading) }, onSwipeLeft = { getKeyDownEvent(KeyDownAction.ChangeCurrentChannelLineIdxToNext, settingsViewModel, mainContentState, isLoading) }, ), ) { Visibility({ mainContentState.currentChannelLine?.hybridType != ChannelLine.HybridType.WebView }) { VideoPlayerScreen( state = videoPlayerState, showMetadataProvider = { settingsViewModel.debugShowVideoPlayerMetadata }, forceTextureView = false, ) } key(mainContentState.isInPlaybackMode) { Visibility({ mainContentState.currentChannelLine?.hybridType == ChannelLine.HybridType.WebView }) { mainContentState.currentChannelLine.let { log.i("当前频道$it, 播放链接: ${it.playableUrl}") val isX5Available = com.tencent.smtt.sdk.QbSdk.canLoadX5(LocalContext.current) if (settingsViewModel.webViewCore == Configs.WebViewCore.X5 && !isX5Available){ settingsViewModel.webViewCore = Configs.WebViewCore.SYSTEM Toast.makeText( LocalContext.current, "X5内核不可用,将进行初始化。已切换为系统内核", Toast.LENGTH_LONG ).show() preInitX5Core(LocalContext.current) } when (settingsViewModel.webViewCore) { Configs.WebViewCore.SYSTEM -> { WebViewScreen( urlProvider = { Pair( it.playbackUrl ?: it.url, it.httpUserAgent ?: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0" ) }, onVideoResolutionChanged = { width, height -> videoPlayerState.metadata = videoPlayerState.metadata.copy( video = (videoPlayerState.metadata.video ?: VideoPlayer.Metadata.Video()).copy( width = width, height = height, ), ) mainContentState.isTempChannelScreenVisible = false }, ) } Configs.WebViewCore.X5 -> { WebViewScreen_X5( urlProvider = { Pair( it.playbackUrl ?: it.url, it.httpUserAgent ?: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0" ) }, onVideoResolutionChanged = { width, height -> videoPlayerState.metadata = videoPlayerState.metadata.copy( video = (videoPlayerState.metadata.video ?: VideoPlayer.Metadata.Video()).copy( width = width, height = height, ), ) mainContentState.isTempChannelScreenVisible = false }, onSelect = { mainContentState.isChannelScreenVisible = true }, onLongSelect = { mainContentState.isQuickOpScreenVisible = true }, ) } } } } } } Visibility({ settingsViewModel.uiShowEpgProgrammePermanentProgress }) { EpgProgrammeProgressScreen( currentEpgProgrammeProvider = { mainContentState.currentPlaybackEpgProgramme ?: epgListProvider().recentProgramme( mainContentState.currentChannel )?.now }, videoPlayerCurrentPositionProvider = { videoPlayerState.currentPosition }, ) } Visibility({ !mainContentState.isTempChannelScreenVisible && !mainContentState.isChannelScreenVisible && !mainContentState.isIptvSourceScreenVisible && !mainContentState.isQuickOpScreenVisible && !mainContentState.isEpgScreenVisible && !mainContentState.isChannelLineScreenVisible && channelNumberSelectState.channelNumber.isEmpty() }) { DatetimeScreen(showModeProvider = { settingsViewModel.uiTimeShowMode }) } ChannelNumberSelectScreen(channelNumberProvider = { channelNumberSelectState.channelNumber }) Visibility({ mainContentState.isTempChannelScreenVisible && !mainContentState.isChannelScreenVisible && !mainContentState.isIptvSourceScreenVisible && !mainContentState.isQuickOpScreenVisible && !mainContentState.isEpgScreenVisible && !mainContentState.isChannelLineScreenVisible && !mainContentState.isVideoPlayerControllerScreenVisible && channelNumberSelectState.channelNumber.isEmpty() }) { ChannelTempScreen( channelProvider = { mainContentState.currentChannel }, channelLineIdxProvider = { mainContentState.currentChannelLineIdx }, recentEpgProgrammeProvider = { epgListProvider().recentProgramme(mainContentState.currentChannel) }, currentPlaybackEpgProgrammeProvider = { mainContentState.currentPlaybackEpgProgramme }, playerMetadataProvider = { videoPlayerState.metadata }, ) } PopupContent( visibleProvider = { mainContentState.isEpgScreenVisible }, onDismissRequest = { mainContentState.isEpgScreenVisible = false }, ) { EpgScreen( epgProvider = { epgListProvider().match(mainContentState.currentChannel) ?: Epg.empty( mainContentState.currentChannel ) }, epgProgrammeReserveListProvider = { EpgProgrammeReserveList(settingsViewModel.epgChannelReserveList.filter { it.channel == mainContentState.currentChannel.name }) }, supportPlaybackProvider = { mainContentState.supportPlayback() }, currentPlaybackEpgProgrammeProvider = { mainContentState.currentPlaybackEpgProgramme }, onEpgProgrammePlayback = { mainContentState.isEpgScreenVisible = false mainContentState.changeCurrentChannel( mainContentState.currentChannel, mainContentState.currentChannelLineIdx, it, ) }, onEpgProgrammeReserve = { programme -> mainContentState.reverseEpgProgrammeOrNot( mainContentState.currentChannel, programme ) }, onClose = { mainContentState.isEpgScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isIptvSourceScreenVisible }, onDismissRequest = { mainContentState.isIptvSourceScreenVisible = false }, ) { IptvSourceScreen( currentIptvSourceProvider = { settingsViewModel.iptvSourceCurrent }, iptvSourceListProvider = {settingsViewModel.iptvSourceList}, onIptvSourceChanged = { mainContentState.isIptvSourceScreenVisible = false settingsViewModel.iptvSourceCurrent = it settingsViewModel.iptvChannelGroupHiddenList = emptySet() settingsViewModel.iptvChannelLastPlay = Channel.EMPTY onReload() }, onClose = { mainContentState.isIptvSourceScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isChannelLineScreenVisible }, onDismissRequest = { mainContentState.isChannelLineScreenVisible = false }, ) { ChannelLineScreen( channelProvider = { mainContentState.currentChannel }, currentLineProvider = { mainContentState.currentChannelLine }, onLineSelected = { mainContentState.isChannelLineScreenVisible = false mainContentState.changeCurrentChannel( mainContentState.currentChannel, mainContentState.currentChannel.lineList.indexOf(it), ) }, onClose = { mainContentState.isChannelLineScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isVideoPlayerControllerScreenVisible }, onDismissRequest = { mainContentState.isVideoPlayerControllerScreenVisible = false }, ) { val threshold = 1000L * 60 * 60 * 24 * 365 val hour0 = -28800000L VideoPlayerControllerScreen( isVideoPlayerPlayingProvider = { videoPlayerState.isPlaying }, isVideoPlayerBufferingProvider = { videoPlayerState.isBuffering }, videoPlayerCurrentPositionProvider = { if (videoPlayerState.currentPosition >= threshold) videoPlayerState.currentPosition else hour0 + videoPlayerState.currentPosition }, videoPlayerDurationProvider = { if (videoPlayerState.currentPosition >= threshold) { val playback = mainContentState.currentPlaybackEpgProgramme if (playback != null) { playback.startAt to playback.endAt } else { val programme = epgListProvider().recentProgramme(mainContentState.currentChannel)?.now (programme?.startAt ?: hour0) to (programme?.endAt ?: hour0) } } else { hour0 to (hour0 + videoPlayerState.duration) } }, onVideoPlayerPlay = { videoPlayerState.play() }, onVideoPlayerPause = { videoPlayerState.pause() }, onVideoPlayerSeekTo = { videoPlayerState.seekTo(it) }, onClose = { mainContentState.isVideoPlayerControllerScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isVideoPlayerDisplayModeScreenVisible }, onDismissRequest = { mainContentState.isVideoPlayerDisplayModeScreenVisible = false }, ) { VideoPlayerDisplayModeScreen( currentDisplayModeProvider = { videoPlayerState.displayMode }, onDisplayModeChanged = { videoPlayerState.displayMode = it }, onApplyToGlobal = { mainContentState.isVideoPlayerDisplayModeScreenVisible = false settingsViewModel.videoPlayerDisplayMode = videoPlayerState.displayMode Snackbar.show("已应用到全局") }, onClose = { mainContentState.isVideoPlayerDisplayModeScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isVideoTracksScreenVisible }, onDismissRequest = { mainContentState.isVideoTracksScreenVisible = false }, ) { VideoTracksScreen( trackListProvider = { videoPlayerState.metadata.videoTracks }, onTrackChanged = { videoPlayerState.selectVideoTrack(it) mainContentState.isVideoTracksScreenVisible = false }, onClose = { mainContentState.isVideoTracksScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isAudioTracksScreenVisible }, onDismissRequest = { mainContentState.isAudioTracksScreenVisible = false }, ) { AudioTracksScreen( trackListProvider = { videoPlayerState.metadata.audioTracks }, onTrackChanged = { videoPlayerState.selectAudioTrack(it) mainContentState.isAudioTracksScreenVisible = false }, onClose = { mainContentState.isAudioTracksScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isSubtitleTracksScreenVisible }, onDismissRequest = { mainContentState.isSubtitleTracksScreenVisible = false }, ) { SubtitleTracksScreen( trackListProvider = { videoPlayerState.metadata.subtitleTracks }, onTrackChanged = { videoPlayerState.selectSubtitleTrack(it) mainContentState.isSubtitleTracksScreenVisible = false }, onClose = { mainContentState.isSubtitleTracksScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isQuickOpScreenVisible }, onDismissRequest = { mainContentState.isQuickOpScreenVisible = false }, ) { QuickOpScreen( currentChannelProvider = { mainContentState.currentChannel }, currentChannelLineIdxProvider = { mainContentState.currentChannelLineIdx }, currentChannelNumberProvider = { (filteredChannelGroupListProvider().channelList.indexOf(mainContentState.currentChannel) + 1).toString() }, epgListProvider = epgListProvider, currentPlaybackEpgProgrammeProvider = { mainContentState.currentPlaybackEpgProgramme }, videoPlayerMetadataProvider = { videoPlayerState.metadata }, videoPlayerIndicatorProvider = { mainContentState.currentChannelLine?.hybridType != ChannelLine.HybridType.WebView }, onShowIptvSource ={ mainContentState.isQuickOpScreenVisible = false mainContentState.isIptvSourceScreenVisible = true }, onShowEpg = { mainContentState.isQuickOpScreenVisible = false mainContentState.isEpgScreenVisible = true }, onShowChannelLine = { mainContentState.isQuickOpScreenVisible = false mainContentState.isChannelLineScreenVisible = true }, onShowVideoPlayerController = { mainContentState.isQuickOpScreenVisible = false mainContentState.isVideoPlayerControllerScreenVisible = true }, onShowVideoPlayerDisplayMode = { mainContentState.isQuickOpScreenVisible = false mainContentState.isVideoPlayerDisplayModeScreenVisible = true }, onShowVideoTracks = { mainContentState.isQuickOpScreenVisible = false mainContentState.isVideoTracksScreenVisible = true }, onShowAudioTracks = { mainContentState.isQuickOpScreenVisible = false mainContentState.isAudioTracksScreenVisible = true }, onShowSubtitleTracks = { mainContentState.isQuickOpScreenVisible = false mainContentState.isSubtitleTracksScreenVisible = true }, toSettingsScreen = { mainContentState.isQuickOpScreenVisible = false toSettingsScreen(it) }, toDashboardScreen = { mainContentState.isQuickOpScreenVisible = false toDashboardScreen() }, onClearCache = { settingsViewModel.iptvChannelLinePlayableHostList = emptySet() settingsViewModel.iptvChannelLinePlayableUrlList = emptySet() coroutineScope.launch { IptvRepository(settingsViewModel.iptvSourceCurrent).clearCache() EpgRepository(settingsViewModel.epgSourceCurrent).clearCache() Snackbar.show("缓存已清除,请重启应用") } }, onClose = { mainContentState.isQuickOpScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isChannelScreenVisible && !settingsViewModel.uiUseClassicPanelScreen }, onDismissRequest = { mainContentState.isChannelScreenVisible = false }, ) { ChannelScreen( channelGroupListProvider = filteredChannelGroupListProvider, favoriteChannelListProvider = favoriteChannelListProvider, currentChannelProvider = { mainContentState.currentChannel }, currentChannelLineIdxProvider = { mainContentState.currentChannelLineIdx }, showChannelLogoProvider = { settingsViewModel.uiShowChannelLogo }, onChannelSelected = { mainContentState.isChannelScreenVisible = false mainContentState.changeCurrentChannel(it) }, onChannelFavoriteToggle = onChannelFavoriteToggle, epgListProvider = epgListProvider, showEpgProgrammeProgressProvider = { settingsViewModel.uiShowEpgProgrammeProgress }, currentPlaybackEpgProgrammeProvider = { mainContentState.currentPlaybackEpgProgramme }, videoPlayerMetadataProvider = { videoPlayerState.metadata }, channelFavoriteEnabledProvider = { settingsViewModel.iptvChannelFavoriteEnable }, channelFavoriteListVisibleProvider = { settingsViewModel.iptvChannelFavoriteListVisible }, onChannelFavoriteListVisibleChange = { settingsViewModel.iptvChannelFavoriteListVisible = it }, onClose = { mainContentState.isChannelScreenVisible = false }, ) } PopupContent( visibleProvider = { mainContentState.isChannelScreenVisible && settingsViewModel.uiUseClassicPanelScreen }, onDismissRequest = { mainContentState.isChannelScreenVisible = false }, ) { ClassicChannelScreen( channelGroupListProvider = filteredChannelGroupListProvider, favoriteChannelListProvider = favoriteChannelListProvider, currentChannelProvider = { mainContentState.currentChannel }, currentChannelLineIdxProvider = { mainContentState.currentChannelLineIdx }, showChannelLogoProvider = { settingsViewModel.uiShowChannelLogo }, onChannelSelected = { mainContentState.isChannelScreenVisible = false mainContentState.changeCurrentChannel(it) }, onChannelFavoriteToggle = onChannelFavoriteToggle, epgListProvider = epgListProvider, epgProgrammeReserveListProvider = { EpgProgrammeReserveList(settingsViewModel.epgChannelReserveList) }, showEpgProgrammeProgressProvider = { settingsViewModel.uiShowEpgProgrammeProgress }, supportPlaybackProvider = { mainContentState.supportPlayback(it, null) }, currentPlaybackEpgProgrammeProvider = { mainContentState.currentPlaybackEpgProgramme }, onEpgProgrammePlayback = { channel, programme -> mainContentState.isChannelScreenVisible = false mainContentState.changeCurrentChannel(channel, null, programme) }, onEpgProgrammeReserve = { channel, programme -> mainContentState.reverseEpgProgrammeOrNot(channel, programme) }, videoPlayerMetadataProvider = { videoPlayerState.metadata }, channelFavoriteEnabledProvider = { settingsViewModel.iptvChannelFavoriteEnable }, channelFavoriteListVisibleProvider = { settingsViewModel.iptvChannelFavoriteListVisible }, onChannelFavoriteListVisibleChange = { settingsViewModel.iptvChannelFavoriteListVisible = it }, onClose = { mainContentState.isChannelScreenVisible = false }, ) } EpgReverseScreen( epgProgrammeReserveListProvider = { settingsViewModel.epgChannelReserveList }, onConfirmReserve = { reserve -> filteredChannelGroupListProvider().channelList.firstOrNull { it.name == reserve.channel } ?.let { mainContentState.changeCurrentChannel(it) } }, onDeleteReserve = { reserve -> settingsViewModel.epgChannelReserveList = EpgProgrammeReserveList(settingsViewModel.epgChannelReserveList - reserve) }, ) } /** * 初始化X5内核 */ private fun preInitX5Core(context: Context) { // Accept context as a parameter // 预加载x5内核 val intent = Intent(context, X5CorePreLoadService::class.java) X5CorePreLoadService.enqueueWork(context, intent) } private fun getKeyDownEvent(actionEvent: KeyDownAction, settingsViewModel: SettingsViewModel, mainContentState: MainContentState, isLoading: Boolean) { when (actionEvent) { KeyDownAction.ChangeCurrentChannelToNext -> { if (settingsViewModel.iptvChannelChangeFlip) mainContentState.changeCurrentChannelToPrev() else mainContentState.changeCurrentChannelToNext() } KeyDownAction.ChangeCurrentChannelToPrev -> { if (settingsViewModel.iptvChannelChangeFlip) mainContentState.changeCurrentChannelToNext() else mainContentState.changeCurrentChannelToPrev() } KeyDownAction.ChangeCurrentChannelLineIdxToPrev -> { if (mainContentState.currentChannel.lineList.size > 1) { mainContentState.changeCurrentChannel( mainContentState.currentChannel, mainContentState.currentChannelLineIdx - 1, ) } } KeyDownAction.ChangeCurrentChannelLineIdxToNext -> { if (mainContentState.currentChannel.lineList.size > 1) { mainContentState.changeCurrentChannel( mainContentState.currentChannel, mainContentState.currentChannelLineIdx + 1, ) } } KeyDownAction.ToIptvSourceScreen -> { mainContentState.isIptvSourceScreenVisible = true } KeyDownAction.ToChannelScreen -> { if (!isLoading) mainContentState.isChannelScreenVisible = true } KeyDownAction.ToQuickOpScreen -> { mainContentState.isQuickOpScreenVisible = true } KeyDownAction.ToEpgScreen -> { mainContentState.isEpgScreenVisible = true } KeyDownAction.ToChannelLineScreen -> { mainContentState.isChannelLineScreenVisible = true } KeyDownAction.ToVideoPlayerControllerScreen -> { mainContentState.isVideoPlayerControllerScreenVisible = true } } }请将以上代码转换为java
最新发布
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值