Android Compose 悬浮窗

今天需要写一个悬浮窗,但是在 Compose 中显示悬浮窗会遇到生命周期问题,我搜了一下,竟然有博主还要付费 才给看,我真的是,开源社会不过是闻道有先后 ,大家互帮互助才有未来,这样明目张胆的放几张收款码让付款才给看几行代码,至于吗?吃相如此难看!看看源码还是可以翻出来的,这里免费给大家分享,开源万岁!我的文章不要求关注,不要求付费,不要求会员,只求一个点赞认可,感谢各位。

今天遇到的问题是两个报错,相信大家主要难以解决的也是这两个问题:

kotlin 复制代码
ViewTreeLifecycleOwner not found from androidx.compose.ui.platform.ComposeView
kotlin 复制代码
Composed into the View which doesn't propagateViewTreeSavedStateRegistryOwner!

解决办法:

groovy 复制代码
implementation("androidx.lifecycle:lifecycle-service:2.5.1")
kotlin 复制代码
import android.graphics.PixelFormat
import android.view.WindowManager
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.LifecycleService
import androidx.lifecycle.setViewTreeLifecycleOwner
import androidx.savedstate.SavedStateRegistry
import androidx.savedstate.SavedStateRegistryController
import androidx.savedstate.SavedStateRegistryOwner
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import com.puremic.karaoke.global.tuning.TuningItemNotifier
import com.puremic.karaoke.ui.theme.PuremicKaraokeTheme

class NotifierService: LifecycleService(), SavedStateRegistryOwner {
    private val savedStateRegistryController by lazy {
        SavedStateRegistryController.create(this)
    }

    override val savedStateRegistry: SavedStateRegistry
        get() = savedStateRegistryController.savedStateRegistry

    override fun onCreate() {
        super.onCreate()
        savedStateRegistryController.performAttach()
        savedStateRegistryController.performRestore(null)

        val windowManager = getSystemService(WindowManager::class.java)
        val params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        )

        val composeView = ComposeView(this).apply {
            setViewTreeLifecycleOwner(this@NotifierService)
            setViewTreeSavedStateRegistryOwner(this@NotifierService)
            setContent {
                PuremicKaraokeTheme {
                    Notifier()
                }
            }
        }
        windowManager.addView(composeView, params)
    }

    @Composable
    private fun Notifier() {
        Box(
            modifier = Modifier.fillMaxSize()
        ) {
            TuningItemNotifier()
        }
    }
}

解决问题的无非就是那三四行代码,祝大家学业有成,步步高升

相关推荐
奈斯先生Vector4 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
TimeFine4 小时前
让强模型做“总工”,让高性价比模型写代码
android
又见情义6 小时前
RK3568 Android 13 屏蔽 healthd 电池日志经验分享
android
古法安卓9 小时前
Android-Fork 机制详解
android·java·android studio
Android打工仔9 小时前
不要在 Data 层随意把 Cold Flow 转换成 Hot Flow
android·架构·kotlin
峥嵘life10 小时前
2026免费的 opencode 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言
杉氧10 小时前
拒绝重复造轮子:我写了一个生产级的 Kotlin 协程与 Flow 工具库(CoroutineKit)
android·kotlin·workflow
恋猫de小郭11 小时前
Flutter GSoC 2026 提案进度解读,补上 DevTools、FFI 和原生平台的关键缺口
android·前端·flutter
2501_9159090611 小时前
怎么用 FlutterFlow 把应用发布到 App Store?
android·ios·小程序·https·uni-app·iphone·webview
峥嵘life11 小时前
2026华为AI码道 CodeArts 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言·python