方案一:
桌面自行开发,可以快速完美的加入负一屏,但是当负一屏的业务越来越多时,会拖累launcher的性能,内存等。
方案二:
Launcher利用反射调用负一屏APP里的类和方法创建View。
缺点:负一屏仍运行在Launcher进行,如果负一屏业务太多,则会影响Launcher的内存占用。
方案三:
利用Google的feed屏方案,导入google官方定义了两个interface接口,ILauncherOverlay和ILauncherOverlayCallback通过aidl进程间通信,从Launcher向负一屏app传递scroll数据,负一屏使用WindowManager.addView的方式添加浮动窗口,用translationX改变负一屏View的位置。
优点:与Launcher完美解耦,运行在独立的进程里,不存在影响Launcher内存问题。
缺点:负一屏View的实现难度大。
综上所述:我们采用方案三来进行负一屏的开发,具体实现技术点如下:
- 全局搜索应用作为服务端,需要实现AIDL接口类ILauncherOverlay,用于客户端(Launcher)进行接口调用。而Launcher作为客户端,需要实现AIDL回调接口(ILauncherOverlayCallback),用于服务端回调客户端的。
- Launcher通过bindservice后,获取IlauncherOverlay实体对象,来和服务端进行通讯,传递关键信息给服务端。
- Launcher在onAttachToWindow的时候,会通过IlauncherOverlay对象的windowAttached(WindowManager.LayoutParams attrs, ILauncherOverlayCallback callbacks, int options)方法,将Launcher的Activity的window属性,和Launcher实例化出来的ILauncherOverlayCallback.Stub回调传给服务端。
- 针对用户在屏幕的滑动操作,调用startScroll、onScroll、endScroll来通知服务端;
- Launcher这边打开关闭负一屏,用openOverlay、closeOverlay来通知服务端。
服务端和客户端实现demo下载地址:https://download.csdn.net/download/hsaekong/12546462