在Android的WindowManager中添加ComposeView的流程及注意事项

news/2024/9/23 4:01:44/

AndroidWindowManagerComposeView_1">在AndroidWindowManager中添加ComposeView的流程及注意事项

流程

总体跟普通的View一样设置窗口参数再用addView添加到WIndowManager中

private val wm by lazy { MobilePlatformPlugin.applicationContext.getSystemService(WINDOW_SERVICE) as WindowManager }fun showPopWindow(context: Context) {val params = WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, // 宽度WindowManager.LayoutParams.MATCH_PARENT, // 高度WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // 窗口类型 TODO: //API LevelWindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 窗口标志PixelFormat.TRANSLUCENT // 像素格式)composeView = ComposeView(context = context).apply {setContent {PopWindowView()}}lifecycleOwner = MyComposeViewLifecycleOwner().also {it.onCreate() // 注意it.attachToDecorView(composeView)}wm.addView(composeView, params)lifecycleOwner?.onStart()lifecycleOwner?.onResume()}

不过ComposeView需要有LifeCycleOwner的支持,不然运行会崩溃,所以需要自定义一个LifeCycleOwner,完全照抄下面这个即可,这里我也是抄的哈哈

    private class MyComposeViewLifecycleOwner : LifecycleOwner, ViewModelStoreOwner,SavedStateRegistryOwner {private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)private val savedStateRegistryController = SavedStateRegistryController.create(this)private val store = ViewModelStore()override val lifecycle: Lifecycleget() = lifecycleRegistryoverride val savedStateRegistry: SavedStateRegistryget() = savedStateRegistryController.savedStateRegistryoverride val viewModelStore: ViewModelStoreget() = storefun onCreate() {savedStateRegistryController.performRestore(null)lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)}fun onStart() {lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)}fun onResume() {lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)}fun onPause() {lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)}fun onStop() {lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)}fun onDestroy() {lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)store.clear()}/*** Compose uses the Window's decor view to locate the* Lifecycle/ViewModel/SavedStateRegistry owners.* Therefore, we need to set this class as the "owner" for the decor view.*/fun attachToDecorView(decorView: View?) {decorView?.let {it.setViewTreeViewModelStoreOwner(this)it.setViewTreeLifecycleOwner(this)it.setViewTreeSavedStateRegistryOwner(this)} ?: return}}

注意事项

这里需要注意一个非常关键的点,有一些资料只执行了LifeCycleOwner的create事件,只执行create事件可能会导致Compose的状态监听失效,所以最后一定要模拟start和resume事件,一定要在addView后添加

lifecycleOwner?.onStart()
lifecycleOwner?.onResume()

这个坑有点大,研究了挺久才发现,所以放出来希望能帮助到遇到同样问题的人们。

销毁

最后关闭悬浮窗也记得执行一下pause,stop,destroy流程

    fun closePopWindow() {if (composeView?.isAttachedToWindow != true) returnwm.removeView(composeView)composeView = nulllifecycleOwner?.onPause()lifecycleOwner?.onStop()lifecycleOwner?.onDestroy()lifecycleOwner = null}

http://www.ppmy.cn/news/1462811.html

相关文章

OOM不会导致JVM退出

问题来源 一次生产事故,由于一次性从数据库查询过多数据导致线程 OOM:Java heap space 异常(千万级表,JVM堆内存2G),但是在线程OOM发生时,java进程却没有立即挂掉。 ##OOM与异常 说到底OutOfM…

阿尔杰姆·卢金采访

近年来,在中俄两国元首亲自擘画、战略引领下,两国新时代全面战略协作伙伴关系成熟坚韧、稳如泰山,树立了新型大国关系的新范式。中俄关系走出了一条大国战略互信、邻里友好的相处之道,给两国人民带来了实实在在的好处,…

plsql 学习

过程化编程语言 赋值:: ||:连接符号 dbms_output.put_line() :输出的语句 var_name ACCOUNTLIBRARY.USERNAME%type; 变量名;某个表的数据类型;赋值给变量名 用下面的方法更好用 异常exception 循…

ESP32-C3模组上跑通OTA升级(8)

接前一篇文章:ESP32-C3模组上跑通OTA升级(7) 本文内容参考: 杂项系统 API - ESP32 - — ESP-IDF 编程指南 latest 文档 《ESP32-C3 物联网工程开发实战》 乐鑫科技 特此致谢! 七、固件版本 将不同功能的固件标记为…

工厂生产管理系统

为应对一些国内验厂,如大疆等,他们需要客户有自己的生产管理系统的,但实际很多公司是没有引入ERP这类的系统的,从而想开发一套简单的生产管理系统。 参考了网上一个比较古老的StorageMange项目,此项目用到DevExpress的…

golang中的位运算 << >> ^ 高位数,低位数示例

在golang的开发中&#xff0c;特别是涉及算法的开发中经常就会用到位运算&#xff0c; 今天介绍 以下几个位运算左右移位运算和高位数低位数的关系。 规则 右移运算符 >> &#xff1a;低位溢出,符号位不变,并用符号位补溢出的高位 左移运算符 <<: 符号位不变…

springboot中线程池的使用

一、概念 线程池就是将多个线程对象放入一个池子里面&#xff0c;例如一个池塘&#xff0c;线程池就是这个池塘&#xff0c;池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程&#xff0c;在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。 二、创…

Leetcode刷题笔记3:链表基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录链表基础1部分的题目&#xff0c;主要题目包括&#xff1a; 203.移除链表元素707.设计链表206.反转链表 知识点 链表 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据…