1.依赖
在当前工程的 build.gradle 文件中添加依赖
compile('com.taobao.android:orange:2.0.1-emas')
2.Service声明
AndroidManifest.xml中加入下面代码
<service
android:name="com.taobao.orange.service.OrangeApiService"
android:exported="false">
<intent-filter>
<action android:name="com.taobao.orange.service.OrangeApiService" />
</intent-filter>
</service>
3.初始化
该方法需要尽可能早的调用, 以便尽可能早从本地缓存或者服务端拿到最新配置
OConfig config = new OConfig.Builder()
.setAppKey(String appKey) //必选
.setAppSecret(String appSecret) //必选
.setAppVersion(String appVersion) //必选, 当前应用版本号
.build();
OrangeConfig.getInstance().init(Context context, OConfig config);
4.检查更新
检查服务端是否有更新, 建议前台后切换进行检查, 防止过度轮询导致不必要的资源浪费, SDK内部强制限制20s之内不能连续检查更新
OrangeConfig.getInstance().forceCheckUpdate();
5.添加自定义条件
第一次添加自定义条件必须确保在init()
接口调用之前, 后续更新自定义条件则不限制调用时机, 以达到动态匹配条件的目的
String key = "${customer_key}"; //自定义key
String value = "${customer_value}"; //自定义value
OrangeConfig.getInstance().addCandidate(new OCandidate(key, value));
6.获取配置
- 配置类型, 根据值类型不同, 分为STANDARD和CUSTOM两种类型
- STANDARD类型: key-value形式
- CUSTOM类型: string形式
- 配置级别, 为了减轻服务端压力, 分为DEFAULT和HIGH两种级别
- HIGH级别: 首次启动应用时SDK默认只会拉取HIGH级别的配置
- DEFAULT级别: 首次启动应用时不会主动拉取DEFAULT级别的配置,只有业务方手动调用以下getConfig/getConfigs/getCustomConfig接口才会触发SDK拉取
- 获取配置, 通过以下异步接口获取
//OrangeConfig.getInstance()获取单例对象
//STANDARD类型namespace配置key对应value, 如果不存在或者还未从文件中反序列化完成返回defaultVal
String getConfig(String namespace, String key, String defaultVal);
//STANDARD类型namespace配置所有key的键值对
Map<String, String> getConfigs(String namespace);
//CUSTOM类型namespace配置的值, 如果不存在或者还未从文件中反序列化完成返回defaultVal
String getCustomConfig(String namespace, String defaultVal)
- 监听配置更新, 由上可知获取配置接口都是异步的, 并不能保证获取的就是文件中序列化的值或者是服务端最新下发的值, 所以为了及时感知配置变更, 需要注册配置监听接口
//OrangeConfig.getInstance()获取单例对象
//注册namespace配置的listener监听器
void registerListener(String[] namespaces, OConfigListener listener);
//去注册namespace配置的listener监听器
void unregisterListener(String[] namespaces, OConfigListener listener);
//注销namespaces配置组的所有监听器
void unregisterListener(String[] namespaces);
同一个namespace最多支持只10个监听器对象, 后续如果又添加一个监听器对象会覆盖最旧的监听器对象, 以此类推, 不需要监听配置更新之后, 最好务必去注册该监听器, 防止潜在的OOM
public interface OConfigListener {
//namespace:配置组名称 args:可变参数(可拓展), 当前存在两个key,
//1. fromCache->配置缓存读取(true)or服务端下发最新(false)
//2. configVersion->当前配置版本号
void onConfigUpdate(String namespace, Map<String, String> args);
}
7、接入主动推送配置能力(如有)
(1)在AndroidMenfest.xml文件中声明OrangeAccsService
<service
android:name="com.taobao.orange.accssupport.OrangeAccsService"
android:exported="false">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.RECEIVE" />
</intent-filter>
</service>
(2)通道服务初始化代码中绑定OrangeAccsService, 即在IAppReceiver的getService接口实现中加入远程配置的Service
put("orange", "com.taobao.orange.accssupport.OrangeAccsService");
IAppReceiver实现示例
private IAppReceiver mAppReceiver = new IAppReceiver() {
private String TAG = "mAppReceiver";
...
...
@Override
public String getService(String serviceId) {
String service = SERVICES.get(serviceId);
return service;
}
@Override
public Map<String, String> getAllServices() {
return SERVICES;
}
};
最佳实践
class A {
private OConfigListener listener = new OConfigListener() {
@Override
public void onConfigUpdate(String namespace, Map<String, String> args) {
if ("test_namespace".equals(namespace)) {
value = OrangeConfig.getInstance().getConfig("test_namespace", "test_key", "default");
}
}
};
private String value = initValue();
private String initValue() {
OrangeConfig.getInstance().registerListener(new String[]{"test_namespace"}, listener);
return OrangeConfig.getInstance().getConfig("test_namespace", "test_key", "default");
}
public String getValue() {
return value;
}
}