安卓桌面Launcher负一屏如何实现各种方案比较设计
背景:
近来很多学员朋友有和我聊到负一屏如何开发设计,针对这个桌面的负一屏功能实现其实在国内厂商还有pixel产品版本都是有的,负一屏主要作用就是实现一些新闻,资讯,快捷服务,游戏宣传等互联网功能,具体功能展示如下:
转换成设计图如下:
了解了负一屏功能后,接下来的问题就是讨论一下这个负一屏的实现方案如何。
负一屏实现核心要点
设计原则:
1、解耦独立性性
负一屏内容属于运营互联网类型功能,所以不适合与桌面这种相对稳定固定的系统应用功能代码有强耦合关系,尽量设计成负一屏属于一个独立的模块,或者独立的app在做相关的内容运营展示。
2、交互性
有了第一部分解耦,独立性,但是毕竟负一屏的相关滑出,滑入操作都是需要与桌面强相关的,那么就需要考虑与桌面交互的方式。如果独立的app,那么这部分就需要考虑好触摸事件这一部分要跨进程传递等。
设计方案1
负一屏展示的那些卡片,控件内容等,都设计成和桌面widget一样的ui,由一个专门app来控制这些widget的显示情况,负一屏直接也是桌面的一个容器View,和其他正常的主页没啥差别。
优点:
1、完全属于桌面的一个页面view,负一屏交互方面的滑出,滑入,不需要考虑跨进程情况,对于桌面来说基本上没有啥适配工作
2、相对稳定性比较好,因为实现原理很简单,这样桌面和负一屏交互关的bug较少
缺点:
1、ui展示不够灵活和丰富,因为widget支持的显示相对比较受到限制,不像activity可以各种自定义view可以自由控制
2、性能方便没有完全自定义view好,widget刷新情况等都是需要控制app跨进程到launcher,让launcher实际刷新绘制,还有触摸相关的交互也一样
设计方案2
有同学提出,高版本不是学了类似TaskView么,TaskView其实本质就是Activity的mutilwindow模式,即一个独立的Activity,嵌入到主Launcher Activity。
优点:
1、松耦合,因为TaskView展示是完全新的一个Activity,所以内容方面可以和桌面没有任何耦合行
2、交互简单,TaskView也属于Launcher的View,所以Launcher滑出负一屏基本上不需要啥工作,所以这块交互工作较少
缺点:
引入了两个Activity但不同的windowmode,同一个画面交互触摸及焦点等问题可能较多
设计方案3
这个是调研主流手机的方案
把负一屏画面设计成一个单独的window,桌面空出负一屏的那一屏幕区域上面专门展示这个负一屏window。
window类型:一般window层级也需要在第二层及和activity这种同层次。
这里调研的pixel类型dump情况如下:
dumpsys一下pixel的负一屏层级结构树情况
可以看到负一屏的windowstate和桌面activity的windowstate都是挂载在ActivityRecord下面,但是负一屏层级比桌面高一层次,所以负一屏就可以覆盖遮挡桌面主Activity内容。
优点:
1、松耦合,因为属于独立的window,这个window可以launcher自己创建,也可以其他app创建,负一屏的画面内容完全不要桌面管,完全自己控制内容情况
2、独立性较好,调试方便,因为属于独立的window即相当于dialog一样,不会影响Activity本身的任何逻辑,比如触摸,焦点等。
缺点:
因为window的滑出滑入需要与桌面Activity进行配合操作,所以需要二者进行触摸的通讯,特别是window如果是独立app的话需要考虑跨进程方式。
好了上面就是收集的粉丝朋友和我这边调研的pixel等一些现成方案。也可以有其他更多更好的实现方案,欢迎大家一起讨论。
更多framework详细代码和资料参考如下链接
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频试看:
https://www.bilibili.com/video/BV1wc41117L4/
参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615
更多framework假威风耗:androidframework007