前言

在开发过程中,会遇到这种业务。

在某一个渠道,需要引入一些三方sdk,需要写一些差异性代码,跟原来的业务有重叠。如果所有的判断逻辑都写在一起,会出现很多if(flavor==xxx),并且三方sdk的包也会都在app里产生增量,直接导致apk过大。

解决方案

话不多说,直接上解决方案:

1、src文件下面分渠道来写代码

2、build.gradle下使用 flavorImplemention 来引入渠道对应的三方库文件

详细案例请往下看

案例:在当贝渠道添加当贝sdk广告库

17553ab0a554a1be732dbf93755c5373.png

54db9aa04455b3899f92ccc4b11d2daf.png

***’dangbeilibs‘***可以单独用于存放dangbeiSDK的库文件

!下面是重要图解

1458856044a37acaccd6e2e1e174c67b.png

1、一般初始化sdk都需要在Application里面初始化。

DangbeiApp继承Appe200f6e9de71550c69f13d5e74e80719.png

2、然后加载广告在DangbeiMainActivity里面加载。

DangbeiMainActivity继承MainActivity569fcd37bf895a443cd10bf118aeb3da.png

3、清单文件也需要配置一下。

0a46991e7ebb55976d3b880ef889931c.png

注意:红色框里面的代码。如果入口activity的category是launcher,那么多个activity就会出现多个桌面应用图标,这里这样写可以只有一个图标

具体的缘由可搜索:“Android清单文件替换优先级相关”

android:name="com.xxxx.DangbeiMainActivity"

android:screenOrientation="landscape"

android:theme="@style/AppTheme.Splash">

//这个activity和主工程里面配置一样,只是intent-filter会被进行替换,以致于整个清单文件 launcher的只有一个

android:name="com.xxxx.ui.main.MainActivity"

android:screenOrientation="landscape"

android:theme="@style/AppTheme.Splash"

tools:node="replace">

复制代码4、在继承的时候,原来MainActivity的一些属性和方法会被继承者使用的,应该改写成protected修饰符

5、如果你的工程使用了dagger,那么新增的Actiivty需要使用注解的,也需要新建module进行配置

7d07f353844774190333c393cda70bd0.png

6、如果你的宿主工程里面的方法使用到了class来进行判断,如果要区分是DangbeiMainActivity还是MainActivity,就需要进行特殊的处理。这里分享出一种方法。

9cd5f241a2204555788a873d6fb7aaca.png

比如: 如果你宿主MainActivity是要跳转到LivePlayActivity,你是这样写的。但是,DangbeiMainActivity里面如果是需要跳转到DangbeiLivePlayActivity(DangbeiLivePlayActivity继承于LivePlayActivity),而你宿主工程里面有没有DangbeiLivePlayActivity这个类,怎么办?

办法就是宿主工程里创建一个Util来保存class,在danbeiApp初始化的时候,设置一下。

public class ClassUtil {

private static volatile ClassUtil mInstance;

private ClassUtil() {

}

public static ClassUtil getInstance() {

if (mInstance == null) {

synchronized (ClassUtil.class) {

if (mInstance == null) {

mInstance = new ClassUtil();

}

}

}

return mInstance;

}

private Class livePlayClass = LivePlayActivity.class;

public void setLivePlayClass(Class livePlayClass) {

this.livePlayClass = livePlayClass;

}

public Class getLivePlayClass() {

return livePlayClass;

}

}

复制代码

eb52c39e89d0d6c7166064ca8669dbd7.png

这样在跳转的时候就可以这样64a8a32b78edb91a64eb1cb1352b9157.png

就实现了跳转到DangbeiLivePlayerActivity而不是宿主工程的原LivePlayActivity

结语

欢迎留言,欢迎交流

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐