远程配置服务

远程搜索服务是构建在互联(uniconnect)服务之上的跨机器的远程服务。该服务类似于Android Preference,可以在本地应用中通过配置XML的方式,在远端设备上生成对应配置的视图布局,同样,通过修改这个视图中配置项的值,就可以直接配置远端设备的配置。

基本概念

RemoteConfigManager(远程配置管理器)

使用它管理远程设备的配置信息,例如:请求远程设备有哪些配置应用,请求某个配置应用的配置信息等等。

RemoteConfig(文本配置项)

作为远程配置项的基类,它的功能类似于Android TextView控件,是用来显示文本的。

SwitchRemoteConfig(开关配置项)

在RemoteConfig的基础上增加了一个开关控件(Switch),Switch的值作为该配置项的值,打开时配置项对应的值为true,关闭时则为false。

CheckBoxRemoteConfig(复选框配置项)

在RemoteConfig的基础上增加了一个复选框控件(CheckBox),CheckBox的值作为该配置项的值,勾选的时候配置项对应的值为true,否则为false。

EditTextRemoteConfig(输入框配置项)

点击配置项时,弹出一个输入框控件(EditText),通过修改EditText的值来配置该配置项的值,配置项值对应的描述会覆盖副标题。

ListRemoteConfig(单选列表框配置项)

点击配置项时,弹出一个单选列表框框控件(ListView),通过选择ListView中的某一个选项来确定该配置项的值,配置项值对应的描述会覆盖副标题。

RemoteConfigGroup(容器项)

类似于ViewGroup,是用来将上述单一控件组合起来的容器控件,该项不可用来配置任何类型的配置值。

RemoteConfigView(远程配置控件)

里面包含一个ListView控件,该控件把所有的配置项布局为这个ListView控件的Item项,用户通过使用该控件,就可以将所有的远程配置项可视化。

RemoteConfig元素的通用XML Attributes(所有远程配置项都带有这些元素)

  • icon:图标
  • key:每个RemoteConfig控件独一无二的”ID”,唯一表示此项
  • enabled:表示该RemoteConfig是否可用,默认为true
  • title:每个RemoteConfig显示的标题——大标题
  • summary:每个RemoteConfig显示的副标题——小标题(可以没有)

SwitchRemoteConfig/CheckBoxRemoteConfig元素的通用XML Attributes说明:

  • checked:是否打开/勾选,[true | false]

EditTextRemoteConfig/ListRemoteConfig元素的通用XML Attributes说明:

  • dialogIcon:弹出框图标
  • dialogTitle:弹出框标题
  • dialogMessage:弹出框内容
  • negativeButtonText:弹出框取消按钮
  • positiveButtonText:弹出框确定按钮

ListRemoteConfig元素的独有XML Attributes说明(需要注意在配置其副标题时,请确保该值包含在entries中):

  • entries:单选列表框的列表选项的值对应的描述,这个描述会在用户选中后覆盖副标题
  • entryValues:列表框的列表选项的值,这个值才是配置项的配置值

使用方法

在本地设备的应用内配置XML作为RemoteConfig的提供者,例如:YourAppProject/res/xml/config.xml,下面是Demo中配置文件的文件内容:

<?xml version="1.0" encoding="utf-8"?>
<!--主容器,标示应用-->
<RemoteConfigGroup
    icon="@drawable/ic_launcher"
    key="com.ingenic.remoteconfig3"
    title="@string/app_name" >

    <!--子容器1,该应用内的第一个配置组,此项表示可以被点击/修改的配置项内容,enabled="true",默认可被点击/修改-->
    <RemoteConfigGroup
        icon="@drawable/ic_launcher"
        key="enable"
        title="可点击/修改" >

        <!--配置组内的配置项-->

        <!--文本配置项,只包含图标和标题-->
        <RemoteConfig
            icon="@drawable/ic_launcher"
            key="1"
            title="1" />

        <!--文本配置项,包含图标、标题和副标题-->
        <RemoteConfig
            icon="@drawable/ic_launcher"
            key="2"
            summary="summary"
            title="2" />

        <!--开关配置项-->
        <SwitchRemoteConfig
            checked="true"
            icon="@drawable/ic_launcher"
            key="3"
            summary="summary"
            title="3" />

        <!--复选框配置项-->
        <CheckBoxRemoteConfig
            checked="true"
            icon="@drawable/ic_launcher"
            key="20"
            summary="summary"
            title="20" />

        <!--输入框配置项-->
        <EditTextRemoteConfig
            dialogTitle="DialogTitle"
            icon="@drawable/ic_launcher"
            key="21"
            negativeButtonText="取消"
            positiveButtonText="确定"
            summary="summary or edittext"
            title="21" />

        <!--单选列表框配置项-->
        <ListRemoteConfig
            dialogTitle="DialogTitle"
            entries="@array/window_animation_scale_entries"
            entryValues="@array/window_animation_scale_values"
            icon="@drawable/ic_launcher"
            key="22"
            negativeButtonText="取消"
            summary="关闭动画"
            title="22" />
    </RemoteConfigGroup>

    <!--子容器2,该应用内的第二个配置组,此项表示可以被点击/修改的配置项内容,enabled="false"-->
    <RemoteConfigGroup
        icon="@drawable/ic_launcher"
        key="disable"
        enabled="false"
        title="不可点击/修改" >
        <RemoteConfig
            enabled="false"
            icon="@drawable/ic_launcher"
            key="23"
            title="23" />
        <RemoteConfig
            enabled="false"
            icon="@drawable/ic_launcher"
            key="24"
            summary="summary"
            title="24" />

        <SwitchRemoteConfig
            checked="false"
            enabled="false"
            icon="@drawable/ic_launcher"
            key="25"
            summary="summary"
            title="25" />

        <CheckBoxRemoteConfig
            checked="false"
            enabled="false"
            icon="@drawable/ic_launcher"
            key="26"
            summary="summary"
            title="26" />

        <EditTextRemoteConfig
            dialogTitle="DialogTitle"
            enabled="false"
            icon="@drawable/ic_launcher"
            key="27"
            negativeButtonText="取消"
            positiveButtonText="确定"
            summary="summary or edittext"
            title="27" />

        <ListRemoteConfig
            dialogTitle="DialogTitle"
            enabled="false"
            entries="@array/window_animation_scale_entries"
            entryValues="@array/window_animation_scale_values"
            icon="@drawable/ic_launcher"
            key="28"
            negativeButtonText="取消"
            summary="关闭动画"
            title="28" />
    </RemoteConfigGroup>

</RemoteConfigGroup>

远程配置服务是IWDS系统服务的子服务,使用方法遵循IWDS服务框架的使用。

    ServiceClient mServiceClient = new ServiceClient(mContext,
                ServiceManagerContext.SERVICE_REMOTE_CONFIG, mConnectionCallbacks);
    mServiceClient.connect();
    //在 mConnectionCallbacks 的回调函数onConnected中获取RemoteConfigManager实例

    @Override
    public void onConnected(ServiceClient serviceClient) {
        mRemoteConfigManager = (RemoteConfigManager) serviceClient
                .getServiceManagerContext();
        // 注册远程配置服务回调
        mRemoteConfigManager.registerRemoteConfigCallback(this);

        // 请求远程设备中所有的远程配置应用信息
        mRemoteConfigManager.requestRemoteConfigProvidersOnly();
    }

服务接口

RemoteConfigManager:

    /**
    * 注册远程配置的回调接口,一个管理器只能注册一个回调接口,
    * 后注册的接口会替换掉之前注册的接口。
    *
    * @param callback
    *            远程配置回调接口
    */
    public void registerRemoteConfigCallback(RemoteConfigCallback callback);

    /**
    * 请求远程设备的所有远程配置提供者提供的所有配置信息
    * <p>
    * 在大多数情况下,客户应该使用
    * {@link RemoteConfigCallback#onRemoteConfigProvidersResult(HashMap)}
    * 获取请求结果,除非设备连接异常
    */
    public void requestRemoteConfigProviders();

    /**
    * 请求远程设备的所有远程配置提供者的信息
    * <p>
    * 在大多数情况下,客户应该使用
    * {@link RemoteConfigCallback#onRemoteConfigProvidersOnlyResult(List)}
    * 获取请求结果,除非设备连接异常
    */
    public void requestRemoteConfigProvidersOnly();

    /**
    * 请求远程设备的所有远程配置中包名为{@code packageName}的提供者的所有配置信息
    * <p>
    * 在大多数情况下,客户应该使用
    * {@link RemoteConfigCallback#onRemoteConfigForPackageResult(RemoteConfigGroup)}
    * 获取请求结果,除非设备连接异常
    *
    * @param packageName
    */
    public void requestRemoteConfigForPackage(String packageName);

    /**
    * 请求修改远程配置项信息<br/>
    *
    * @param infos
    */
    public void requestUpdateRemoteConfigs(List<RemoteConfigValueInfo> infos);

    /**
    * 远程配置服务回调接口
    */
    public interface RemoteConfigCallback {

        /**
        * 请求远程配置提供者的回调接口
        *
        * @param providers
        *            所有的远程配置信息
        * @see {@link RemoteConfigManager#requestRemoteConfigProviders()}
        */
        public void onRemoteConfigProvidersResult(
                HashMap<String, RemoteConfigGroup> providers);

        /**
        * 请求对用包名的远程配置的回调接口
        *
        * @param group 远程配置
        *(结合{@link RemoteConfigView#syncRemoteConfig(Context, RemoteConfigGroup)}使用)
        * @see {@link RemoteConfigManager#requestRemoteConfigForPackage(String)}
        */
        public void onRemoteConfigForPackageResult(RemoteConfigGroup group);

        /**
        * 接收到远程配置的Icon
        *
        * @param info 远程配置的Icon
        */
        public void onRemoteConfigIconArrived(RemoteConfigIconInfo info);

        /**
        * 请求发送结果
        *
        * @param resultCode 请求发送的返回码
        */
        public void onRequestSendResult(int resultCode);

        /**
        * 远程配置提供者改变
        * <p>
        * 你可以通过再次想远程设备发出请求来获取新的远程配置信息
        *
        * @see {@link RemoteConfigManager#requestRemoteConfigProviders()} or
        * @see {@link RemoteConfigManager#requestRemoteConfigProvidersOnly()} or
        * @see {@link RemoteConfigManager#requestRemoteConfigForPackage(String)}
        */
        public void onProviderChanged(ProviderChangedCmdInfo info);

        /**
        * 请求远程配置提供者的回调接口
        *
        * @param providers
        * @see {@link RemoteConfigManager#requestRemoteConfigProvidersOnly()}
        */
        public void onRemoteConfigProvidersOnlyResult(
                List<RemoteConfig> providers);

        /**
        * 远程设备连接状态改变
        * @param isAvailable
        */
        public void onAvailableChanged(boolean isAvailable);
    }

RemoteConfigView:

    /**
    * 同步(设置)远程配置信息,设置后,配置项信息会以列表的信息显示在RemoteConfigView中
    */
    public void syncRemoteConfig(Context context, 
            RemoteConfigGroup remoteConfigGroup);

    /**
    * 同步配置项的图标,因为图片信息的信息量比较大,为了显示更快,这里单独提供同步图标的接口
    */
    public void syncRemoteConfigIcon(RemoteConfigIconInfo info);

    /**
    * 获取被修改的配置项信息,第一次获取时还没有更改,这时候会返回null
    */
    public List<RemoteConfigValueInfo> getChangedRemoteConfigInfo();

    /**
    * 获取装配置信息用的ListView,你可以用来自定义列表的样式
    */
    public ListView getListView();

相关资源

远程配置服务Demo:elf/samples/RemoteConfigDemo

  • 配置提供者Demo:RemoteConfigProvider
  • 远程配置端Demo:RemoteConfigTest