##方案一: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的位置 可参考: blog.csdn.net/u013032242/… 该方案的优缺点:
- 负一屏View的实现较方案一难度大
- 与Launcher完美解耦,运行在独立的进程里,不存在影响Launcher内存问题。