android负一屏实现方案

方案一:

桌面自行开发,可以快速完美的加入负一屏,但是当负一屏的业务越来越多时,会拖累launcher的性能,内存等。

方案二:

Launcher利用反射调用负一屏APP里的类和方法创建View。

缺点:负一屏仍运行在Launcher进行,如果负一屏业务太多,则会影响Launcher的内存占用。

方案三:

利用Google的feed屏方案,导入google官方定义了两个interface接口,ILauncherOverlay和ILauncherOverlayCallback通过aidl进程间通信,从Launcher向负一屏app传递scroll数据,负一屏使用WindowManager.addView的方式添加浮动窗口,用translationX改变负一屏View的位置。

优点:与Launcher完美解耦,运行在独立的进程里,不存在影响Launcher内存问题。

缺点:负一屏View的实现难度大。

综上所述:我们采用方案三来进行负一屏的开发,具体实现技术点如下:

  1. 全局搜索应用作为服务端,需要实现AIDL接口类ILauncherOverlay,用于客户端(Launcher)进行接口调用。而Launcher作为客户端,需要实现AIDL回调接口(ILauncherOverlayCallback),用于服务端回调客户端的。
  2. Launcher通过bindservice后,获取IlauncherOverlay实体对象,来和服务端进行通讯,传递关键信息给服务端。
  3. Launcher在onAttachToWindow的时候,会通过IlauncherOverlay对象的windowAttached(WindowManager.LayoutParams attrs, ILauncherOverlayCallback callbacks, int options)方法,将Launcher的Activity的window属性,和Launcher实例化出来的ILauncherOverlayCallback.Stub回调传给服务端。
  4. 针对用户在屏幕的滑动操作,调用startScroll、onScroll、endScroll来通知服务端;
  5. Launcher这边打开关闭负一屏,用openOverlay、closeOverlay来通知服务端。

服务端和客户端实现demo下载地址:https://download.csdn.net/download/hsaekong/12546462

你可能感兴趣的:(android负一屏实现方案)