【问题标题】: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
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多