远程设备管理服务

远程设备管理服务是建立在DataTransactor之上的跨机器的远程服务,可以远程控制对端设备,操作的实际执行者是远程设备的设备管理服务。

基本概念

RemoteDeviceService(远程设备管理服务)

代表远程设备管理服务,服务运行在手机端,用于管理与手机相连接的手表,它提供了安装/删除/查询应用,监听远程设备状态,查询远程设备信息,解除与手表的绑定关系等功能。

RemoteDeviceServiceManager(远程设备管理器)

代表远程设备管理器,它是远程设备管理服务对外提供的操作接口,用户只要获取到该实例对象就可以进行远程设备管理操作。

RemoteCallbackList(远程回调列表)

代表访问远程设备管理服务的客户端回调列表,远程设备管理服务同时允许多个客户端访问,访问结果通过回调的形式获取,需要客户端注册相关的回调到该列表里。

使用方法

远程设备管理服务是IWDS系统服务的子服务,使用方法遵循IWDS服务框架的使用。

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

public void onConnected(ServiceClient serviceClient) {
    mRemoteDeviceManager = (RemoteDeviceServiceManager) serviceClient.getServiceManagerContext();
    ... ...
    mRemoteDeviceManager.registerUnbondListener(m_remoteDeviceUnbondListener);// mRemoteDeviceBondListener监听解绑结果
    mRemoteDeviceManager.requestNotifyUnbond(mBondLink.getLocalDescriptor()); // 解绑
    ... ...
}

服务接口

/**
     * 请求获取远程设备的应用列表。应用列表通过回调
     * {@link RemoteDeviceAppListener#onRemoteAppInfoListAvailable(List)} 返回。
     */
    public void requestGetAppList();

    /**
     * 请求获取远程设备的存储空间信息。存储空间信息通过回调
     * {@link RemoteDeviceAppListener#onRemoteStorageInfoAvailable(RemoteStorageInfo)}
     * 返回。
     */
    public void requestGetStorageInfo();

    /**
     * 请求在远程设备安装应用。安装结果通过回调
     * {@link RemoteDeviceAppListener#onDoneInstallApp(String, int)}返回。
     * 
     * @param apkFilePath
     *            apk文件在本地设备的路径
     * @param isInstalledInExternal
     *            表示是否安装在远程设备的外部存储空间,如果为真,安装在外部存储;否则安装在内部存储。
     */
    public void requestInstallApp(String apkFilePath, boolean isInstalledInExternal);

    /**
     * 请求在远程设备卸载应用。卸载结果通过回调
     * {@link RemoteDeviceAppListener#onDoneDeleteApp(String, int)}返回。
     * 
     * @param packageName
     *            被请求卸载的应用包名
     */
    public void requestDeleteApp(String packageName);

    /**
     * 请求获取远程设备的应用信息。应用信息通过回调
     * {@link RemoteDeviceAppListener#onResponsePkgSizeInfo(PackageStats, int)}
     * 返回。
     * 
     * @param packageName
     *            被请求信息的应用包名
     */
    public void requestPkgSizeInfo(String packageName);

    /**
     * 请求清除远程设备应用的用户数据或缓存。清除结果通过
     * {@link RemoteDeviceAppListener#onResponseClearAppDataOrCache(String, int, int)}
     * 返回。
     * 
     * @param packageName
     *            被请求清除数据或缓存的应用包名
     * @param requestType
     *            请求的操作类型,可能的值为:
     *            {@link RemoteDeviceManagerInfo#TYPE_CLEAR_APP_USER_DATA},
     *            {@link RemoteDeviceManagerInfo#TYPE_CLEAR_APP_CACHE}
     */
    public void requestClearAppDataOrCache(String packageName, int requestType);

    /**
     * 请求清除远程设备所有应用的用户数据或缓存。清除结果通过
     * {@link RemoteDeviceAppListener#onResponseClearAllAppDataAndCache(int, int, String, int, int)}
     * 返回。
     */
    public void requestClearAllAppDataAndCache();

    /**
     * 请求获取远程设备系统内存信息。内存信息通过回调
     * {@link RemoteDeviceProcessListener#onResponseSystemMemoryInfo(long, long)}
     * 返回。
     */
    public void requestSystemMemoryInfo();

    /**
     * 请求获取远程设备正在运行的进程信息。正在运行的进程信息通过回调
     * {@link RemoteDeviceProcessListener#onResponseRunningAppProcessInfo(List)}
     * 返回。
     */
    public void requestRunningAppProcessInfo();

    /**
     * 请求杀远程设备的进程。结果通过回调
     * {@link RemoteDeviceProcessListener#onDoneKillProcess(String)}返回。
     * 
     * @param packageName
     *            进程对应的应用包名
     */
    public void requestKillProcess(String packageName);

    /**
     * 请求通知远程设备解绑状态。结果通过回调
     *
     * @param decctiptor 手机设备描述符
     */
    public void requestNotifyUnbond(DeviceDescriptor descriptor);

   /**
     * 注册远程设备服务的解绑状态监听器。
     *
     * @param listener
     *            连接状态监听器
     * @return 返回真,表示注册成功;否则为失败。
     */
    public boolean registerUnbondListener(RemoteDeviceUnbondListener listener);

    /**
     * 注销远程设备服务的解绑状态监听器。
     */
    public void unregisterUnbondListener();

    ... ...

还有一些成对的registerXXXListener、unregisterXXXListener注册注销监听的接口,用于或取远程设备管理操作的结果。

绑定与解绑:

  • 在设备管理服务中提到绑定与解绑,这两个操作都是手机端发起的,手表是被动接受的。绑定只需手机端扫描手表二维码获取蓝牙地址后调用Link的bondAddress,第一次连接成功就认为是绑定。同一个手机只能绑定一只手表,调用bondAddress连接时如果传入设备与绑定的设备不符,则拒绝连接。

    

private boolean bondAddressLocked(String pkg, String addr) {

        if (mIsBondWatch && mBondDescriptor != null
                && !mBondDescriptor.devAddress.equals(addr)) {
            return false;
        }
        … … //后面调用Link的bondAddress
}

  • 解绑需要手机端主动调用远程设备管理服务的接口registerUnbondListener注册解绑监听,用于获取解绑结果,然后调用requestNotifyUnbond进行解绑。成功解绑在注册的监听回调中将清除绑定信息。

    

private RemoteDeviceUnbondListener mRemoteDeviceBondListener = new RemoteDeviceUnbondListener() {
        @Override
        public void onResquestDeviceUnbondResult(int resultCode) {

            if (resultCode == RemoteDeviceManagerInfo.REQUEST_SUCCEEDED
                    || resultCode == RemoteDeviceManagerInfo.REQUEST_NOTIFY_UNBOND_FAILED) {
                synchronized (mLocked) {
                    mIsBondWatch = false;
                    mBondDescriptor = null;
	      IwdsUtils.saveBondStatus(mContext, mIsBondWatch);
                    IwdsUtils.saveBondDescriptor(mContext, mBondDescriptor);

                }
            }
        }
    };

mRemoteDeviceManager.registerUnbondListener(mRemoteDeviceBondListener);

mRemoteDeviceManager.requestNotifyUnbond(mBondLink.getLocalDescriptor());