Launcher的负一屏方案总结

2018-10-23  本文已影响0人  汪和呆喵

方案一:app插件化方案

负一屏View的添加方法:

在Launcher里bindScreens()时判断hasCustomContentToLeft,向workspace添加一页CellLayout
负一屏App使用插件话方案,Launcher利用反射调用负一屏app里的类和方法创建View。
可以实现多种不同的负一屏。

App插件化方案基本原理:

获取插件app的Context

Context e = activity.getApplicationContext().createPackageContext(targetPackageName, 
Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);

利用反射接口取得第三方应用里的代理类,并进行构造:

Class clazz = e.getClassLoader().loadClass(targetClassName);
Constructor constructor = clazz.getDeclaredConstructor(new Class[]{Context.class, Activity.class});
Object mPageProxyImpl = constructor.newInstance(new Object[]{pkgContext, activity});

该方案优缺点:
1.负一屏View使用Launcher3自带的customLayout方案,实现简单
2.独立化方案可以使launcher和负一屏的开发解耦
3.负一屏仍运行在Launcher进程,如果负一屏业务太多,则会影响Launcher的内存占用
4.两个apk间的数据传递仍存在问题,需要通过进程间通信方案解决

方案二:app插件化方案

导入google官方定义了两个interface接口,ILauncherOverlay和ILauncherOverlayCallback
通过aidl进程间通信,从Launcher向负一屏app传递scroll数据
负一屏使用WindowManager.addView的方式添加浮动窗口
用translationX改变负一屏View的位置
可参考:
https://blog.csdn.net/u013032242/article/details/82885110
该方案的优缺点:

  1. 负一屏View的实现较方案一难度大
  2. 与Launcher完美解耦,运行在独立的进程里,不存在影响Launcher内存问题。
上一篇下一篇

猜你喜欢

热点阅读