Android SDK开发艺术探索系列基于实际生产中的业务型SDK开发实践经验,具有一定的实战性与技术性,不仅包含一定业务背景下的经验之谈,还系统性地介绍了一款第三方SDK的开发过程以及相关技术的选型。
在这个系列中,你不仅能了解到如何开发一款第三方SDK,还能学习到通用的Android开发知识、软件工程思想,甚至一些奇奇怪怪的知识。
个性化配置
一、SDK自定义配置
1.1、什么是自定义配置
在SDK开发中,常见的需求是提供一系列配置方法,用于自定义SDK行为。比如切换调试/正式模式,启动/关闭某些功能。
1.2、设计一个配置方法
前面我们介绍了自定义配置的概念,并且参考了某推送SDK实现的自定义配置方法。相信大家也能据此思想实现自己SDK的配置了吧!
但是,这种方式未免不太过瘾,我们平时开发的时候也可以看到Java代码中有一种很爽的调用方式,随便举个例子:
StringBuilder builder = new StringBuilder();
builder.append("one").append("two").append("three").length();
可以看到,连续的流式调用API很方便也很简洁。这种API实现方式又称为流式接口(fluent interface)是软件工程中面向对象API的一种实现方式。那么问题来了,这么好的API设计思想,为什么不用到我们的SDK中来,让开发者爽一把呢?
先来回顾一下SDK配置的本质:SDK配置方法的本质是为SDK相关功能提供默认配置,并且接收开发者的自定义配置,用于修改默认逻辑。
所以我们的方法中,不仅包含默认选项,还要包含修改方方法。话不多说,先上一份模板实例:
配置方法
public class MySDKConfig {
//默认配置
private static boolean sDebug = false;
private static long sTimeout = 8000L;
private static final MySDKConfig.Config CONFIG = new MySDKConfig.Config();
public static class Config {
private Config() {
}
/**
* 设置调试模式
*
* @param isDebug 模式
* @return Config
*/
public MySDKConfig.Config setDebug(final boolean isDebug) {
sDebug = isDebug;
return this;
}
/**
* 设置超时时间
*
* @param timeout 超时时间
* @return Config
*/
public MySDKConfig.Config setTimeout(final long timeout) {
//此处演示了边界值的处理方式
long minTimeout = 3000L;
if (timeout < minTimeout) {
sTimeout = minTimeout;
} else {
sTimeout = timeout;
}
return this;
}
}
public static boolean isDebug() {
return sDebug;
}
public static long getTimeout() {
return sTimeout;
}
public static MySDKConfig.Config getConfig() {
return CONFIG;
}
}
调用示例
//一行代码,流式调用
MySDKConfig.getConfig().setDebug(true).setTimeout(8000L);
从源码实例可以看到,我们提供了一些默认配置。并通过静态内部类来实现自定义配置,并且在外层提供了getter方法,将配置提供给SDK其他模块调用。
其中实现流式调用的关键就是每个setter方法中都返回了this对象本身,就这样实现了流式API接口。
在SDK开发的场景中,由于需要配置的内容多,还涉及到默认配置,特别适合采用流式API配置方法构建自定义配置。其实回头一想,这种设计思想其实不就是简化版建造者(Builder)模式的使用场景吗?
ok,到这里我们已经介绍了 SDK 开发的大部分知识,下一篇,会介绍:
- 安全与校验
- 压缩与优化
- 依赖原则与打包方法