Android 不同渠道差异代码

作者: Jafir | 来源:发表于2019-11-18 17:45 被阅读0次

    前言

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

    解决方案

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

    1、src文件下面分渠道来写代码
    2、build.gradle下使用 flavorImplemention 来引入渠道对应的三方库文件

    详细案例请往下看

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

    工程结构 build.gradle

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

    !下面是重要图解

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

    DangbeiApp继承App


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

    DangbeiMainActivity继承MainActivity


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

    注意:红色框里面的代码。如果入口activity的category是launcher,那么多个activity就会出现多个桌面应用图标,这里这样写可以只有一个图标
    具体的缘由可搜索:“Android清单文件替换优先级相关”

      <activity
                android:name="com.xxxx.DangbeiMainActivity"
                android:screenOrientation="landscape"
                android:theme="@style/AppTheme.Splash">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
    //这个activity和主工程里面配置一样,只是intent-filter会被进行替换,以致于整个清单文件 launcher的只有一个
     <activity
                android:name="com.xxxx.ui.main.MainActivity"
                android:screenOrientation="landscape"
                android:theme="@style/AppTheme.Splash"
                tools:node="replace">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                </intent-filter>
            </activity>
    
    
    4、在继承的时候,原来MainActivity的一些属性和方法会被继承者使用的,应该改写成protected修饰符
    5、如果你的工程使用了dagger,那么新增的Actiivty需要使用注解的,也需要新建module进行配置
    配置dagger的module
    6、如果你的宿主工程里面的方法使用到了class来进行判断,如果要区分是DangbeiMainActivity还是MainActivity,就需要进行特殊的处理。这里分享出一种方法。
    例如

    比如: 如果你宿主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<Activity> getLivePlayClass() {
            return livePlayClass;
        }
    }
    
    设置class

    这样在跳转的时候就可以这样


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

    结语

    欢迎留言,欢迎交流

    相关文章

      网友评论

        本文标题:Android 不同渠道差异代码

        本文链接:https://www.haomeiwen.com/subject/ofubictx.html