【问题标题】:Create a view from a service with jetpack compose使用 jetpack compose 从服务创建视图
【发布时间】:2022-09-25 06:53:29
【问题描述】:
每当我们需要来自服务的视图时,我们使用以下
val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val v = inflater.inflate(R.layout.mylayout,null) as view
windowManager.addView(v,params)
如果这次使用 @Composable 而不是布局,如何获得相同的结果?
标签:
android
kotlin
android-jetpack-compose
android-jetpack
【解决方案1】:
我使用以下内容在服务中使用 compose,它适用于普通服务和输入服务。它只是复制 ComponentActivity 中的内容。
class TranslationOverlayServiceddd : Service(), LifecycleOwner, ViewModelStoreOwner,
SavedStateRegistryOwner {
private val mSavedStateRegistryController = SavedStateRegistryController.create(this)
private var windowManager: WindowManager? = null
private var serviceView: View? = null
override fun onBind(intent: Intent?): IBinder? {
return null
}
private fun addOverlayView() {
serviceView = TranslationPopupView(this)
windowManager!!.addView(serviceView, null)
serviceView?.let { decorView ->
ViewTreeLifecycleOwner.set(decorView, this)
ViewTreeViewModelStoreOwner.set(decorView, this)
decorView.setViewTreeSavedStateRegistryOwner(this)
}
serviceView?.let {
ViewTreeLifecycleOwner.set(it, this)
ViewTreeViewModelStoreOwner.set(it, this)
it.setViewTreeSavedStateRegistryOwner(this)
}
}
override val savedStateRegistry: SavedStateRegistry
get() = mSavedStateRegistryController.savedStateRegistry
private val mLifecycleRegistry = LifecycleRegistry(this)
override fun getLifecycle(): Lifecycle = mLifecycleRegistry
private val store = ViewModelStore()
override fun getViewModelStore(): ViewModelStore = store
private fun handleLifecycleEvent(event: Lifecycle.Event) =
mLifecycleRegistry.handleLifecycleEvent(event)
override fun onCreate() {
super.onCreate()
mSavedStateRegistryController.performRestore(null)
handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
addOverlayView()
}
override fun onDestroy() {
super.onDestroy()
handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
if (serviceView != null) {
windowManager!!.removeView(serviceView)
serviceView = null
}
}
}