全部产品
云市场

Android 接入

更新时间:2019-09-25 11:07:23

1.依赖

在当前工程的 build.gradle 文件中添加依赖

  1. compile('com.taobao.android:orange:2.0.1-emas')

2.Service声明

AndroidManifest.xml中加入下面代码

  1. <service
  2. android:name="com.taobao.orange.service.OrangeApiService"
  3. android:exported="false">
  4. <intent-filter>
  5. <action android:name="com.taobao.orange.service.OrangeApiService" />
  6. </intent-filter>
  7. </service>

3.初始化

该方法需要尽可能早的调用, 以便尽可能早从本地缓存或者服务端拿到最新配置

  1. OConfig config = new OConfig.Builder()
  2. .setAppKey(String appKey) //必选
  3. .setAppSecret(String appSecret) //必选
  4. .setAppVersion(String appVersion) //必选, 当前应用版本号
  5. .build();
  6. OrangeConfig.getInstance().init(Context context, OConfig config);

4.检查更新

检查服务端是否有更新, 建议前台后切换进行检查, 防止过度轮询导致不必要的资源浪费, SDK内部强制限制20s之内不能连续检查更新

  1. OrangeConfig.getInstance().forceCheckUpdate();

5.添加自定义条件

第一次添加自定义条件必须确保在init()接口调用之前, 后续更新自定义条件则不限制调用时机, 以达到动态匹配条件的目的

  1. OrangeConfig.getInstance().addCandidate(OCandidate candidate);
  2. //默认使用StringCompare.class
  3. OCandidate(String key, String clientVal);
  4. //自定义表达式匹配规则
  5. OCandidate(String key, String clientVal, Class<? extends ICandidateCompare> compareClz);

内置表达式匹配规则如下:

  • IntCompare.class: 数字匹配规则, 支持 = >= <= > < !=
  • StringCompare.class: 字符串匹配规则, 支持 = != ~= !~
  • VersionCompare.class: 版本匹配规则, 支持 = >= <= > < !=

6.获取配置

  • 配置类型, 根据值类型不同, 分为STANDARD和CUSTOM两种类型
  1. STANDARD类型: key-value形式
  2. CUSTOM类型: string形式
  • 配置级别, 为了减轻服务端压力, 分为DEFAULT和HIGH两种级别
  1. HIGH级别: 首次启动应用时SDK默认只会拉取HIGH级别的配置
  2. DEFAULT级别: 首次启动应用时不会主动拉取DEFAULT级别的配置,只有业务方手动调用以下getConfig/getConfigs/getCustomConfig接口才会触发SDK拉取
  • 获取配置, 通过以下异步接口获取
  1. //OrangeConfig.getInstance()获取单例对象
  2. //STANDARD类型namespace配置key对应value, 如果不存在或者还未从文件中反序列化完成返回defaultVal
  3. String getConfig(String namespace, String key, String defaultVal);
  4. //STANDARD类型namespace配置所有key的键值对
  5. Map<String, String> getConfigs(String namespace);
  6. //CUSTOM类型namespace配置的值, 如果不存在或者还未从文件中反序列化完成返回defaultVal
  7. String getCustomConfig(String namespace, String defaultVal)
  • 监听配置更新, 由上可知获取配置接口都是异步的, 并不能保证获取的就是文件中序列化的值或者是服务端最新下发的值, 所以为了及时感知配置变更, 需要注册配置监听接口
  1. //OrangeConfig.getInstance()获取单例对象
  2. //注册namespace配置的listener监听器
  3. void registerListener(String[] namespaces, OConfigListener listener);
  4. //去注册namespace配置的listener监听器
  5. void unregisterListener(String[] namespaces, OConfigListener listener);
  6. //注销namespaces配置组的所有监听器
  7. void unregisterListener(String[] namespaces);

同一个namespace最多支持只10个监听器对象, 后续如果又添加一个监听器对象会覆盖最旧的监听器对象, 以此类推, 不需要监听配置更新之后, 最好务必去注册该监听器, 防止潜在的OOM

  1. public interface OConfigListener {
  2. //namespace:配置组名称 args:可变参数(可拓展), 当前存在两个key,
  3. //1. fromCache->配置缓存读取(true)or服务端下发最新(false)
  4. //2. configVersion->当前配置版本号
  5. void onConfigUpdate(String namespace, Map<String, String> args);
  6. }

7、接入主动推送配置能力(如有)

(1)在AndroidMenfest.xml文件中声明OrangeAccsService

  1. <service
  2. android:name="com.taobao.orange.accssupport.OrangeAccsService"
  3. android:exported="false">
  4. <intent-filter>
  5. <action android:name="com.taobao.accs.intent.action.RECEIVE" />
  6. </intent-filter>
  7. </service>

(2)通道服务初始化代码中绑定OrangeAccsService, 即在IAppReceiver的getService接口实现中加入远程配置的Service

  1. put("orange", "com.taobao.orange.accssupport.OrangeAccsService");

IAppReceiver实现示例

  1. private IAppReceiver mAppReceiver = new IAppReceiver() {
  2. private String TAG = "mAppReceiver";
  3. ...
  4. ...
  5. @Override
  6. public String getService(String serviceId) {
  7. String service = SERVICES.get(serviceId);
  8. return service;
  9. }
  10. @Override
  11. public Map<String, String> getAllServices() {
  12. return SERVICES;
  13. }
  14. };

最佳实践

  1. class A {
  2. private OConfigListener listener = new OConfigListener() {
  3. @Override
  4. public void onConfigUpdate(String namespace, Map<String, String> args) {
  5. if ("test_namespace".equals(namespace)) {
  6. value = OrangeConfig.getInstance().getConfig("test_namespace", "test_key", "default");
  7. }
  8. }
  9. };
  10. private String value = initValue();
  11. private String initValue() {
  12. OrangeConfig.getInstance().registerListener(new String[]{"test_namespace"}, listener);
  13. return OrangeConfig.getInstance().getConfig("test_namespace", "test_key", "default");
  14. }
  15. public String getValue() {
  16. return value;
  17. }
  18. }