ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Android 可穿戴数据层同步数据单元(DataItem)实战:DataMap 写入与监听完整指南

Android 可穿戴数据层同步数据单元(DataItem)实战:DataMap 写入与监听完整指南 文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载本篇技术指南以《Android官方培训课程中文版》仓库中的 同步数据单元 一节为核心系统讲解 Android Wear 可穿戴数据层Wearable Data Layer API中数据单元DataItem的概念、创建流程、Data Map 的使用方法以及如何在前台 Activity 与后台 Service 中监听数据单元的变化事件。读完本文你将掌握在手持设备与可穿戴设备之间同步键值对数据的完整方案包括 100KB 限制内的载荷设计、路径规范、断线缓冲机制与事件回调的注册/注销生命周期管理。Android Wear 支持多个可穿戴设备同时连接一台手持设备。为了实现跨设备的数据一致性Google Play services 的可穿戴数据层提供了一组自动同步的数据对象其中DataItem数据单元是最基础的同步载体它被保存在一个复制的数据仓库中系统会自动将其从手持设备同步到可穿戴设备反之亦然开发者无需关心底层蓝牙、Wi-Fi 或云节点的传输细节。下图展示了数据层典型的多节点网络结构手表通过蓝牙直连手机手机经移动网络/Wi-Fi 连接云端节点另一块手表可通过 Wi-Fi 连接云节点数据单元正是在这样的网络中完成同步。数据单元DataItem可穿戴数据层的基础同步载体DataItem 是系统用于在手持设备与可穿戴设备之间同步数据的接口。与不保证送达的消息不同DataItem 是自动同步的数据存储只要设备处于连接状态直连或经云节点中转一端写入的数据最终会出现在另一端。一个 DataItem 通常由两个核心部分组成组成说明限制Payload载荷一个字节数组可用于放置任意数据开发者需要自行完成对象的序列化与反序列化大小限制在100KB之内Path路径唯一且以斜线/开头的字符串如/path/to/data用于唯一标识该数据项必须以/开头且在应用中唯一100KB 的限制决定了 DataItem 适合承载小数据的同步如计数、设置、状态值。如果需要传输更大的二进制数据如图像、音视频应改用 Asset 资源 或 Channel API它们不受 100KB 限制——这属于数据层中的另一套机制本文不展开。在数据层这一套 API 中数据单元与其他同步机制各有分工详见数据层总览 发送并同步数据DataItem需要自动同步的小型数据存储MessageApi单向消息适合 RPC 式请求如从手表控制手机的媒体播放器Asset附着在 DataItem 上的二进制大对象系统自动缓存以避免重复传输ChannelApi大文件/数据流的可靠传输通道如音乐、电影。通过 PutDataRequest 创建数据单元通常不直接实现 DataItem 接口而是通过构建请求对象交给系统由系统返回正确实现DataItem接口的对象。标准流程如下创建一个 PutDataRequest 对象并指定一个字符串路径以唯一确定该数据项调用setData(byte[])方法设置载荷Payload调用DataApi.putDataItem()方法请求系统创建数据单元当请求完成时系统会返回正确实现DataItem接口的对象。对应的核心调用骨架为// 1. 创建请求并指定路径 PutDataRequest request PutDataRequest.create(/path/to/data); // 2. 设置载荷字节数组 100KB request.setData(serializedBytes); // 3. 请求系统创建数据单元 PendingResultDataApi.DataItemResult pendingResult Wearable.DataApi.putDataItem(mGoogleApiClient, request); // 4. 结果对象中携带系统返回的 DataItem见后文 PendingResult 处理由于直接操作原始字节需要手动处理序列化/反序列化官方更推荐使用下面介绍的Data Map方案将数据单元包装进一个易用的、类似Bundle的接口中。用 Data Map 同步数据推荐DataMap 类把数据单元处理为类似 Android Bundle 的形式系统会负责对象的序列化与反序列化开发者只需以键值对key-value的方式操纵数据。这也是原文档中明确给出的建议方案见 同步数据单元。使用 Data Map 的五步流程创建一个 PutDataMapRequest 对象并设置数据单元的路径调用PutDataMapRequest.getDataMap()获取可用的 Data Map 对象使用put...()系列方法如putString()、putInt()为 Data Map 设置数据调用PutDataMapRequest.asPutDataRequest()获得PutDataRequest对象调用DataApi.putDataItem()请求系统创建数据单元。下面来自原文档的increaseCounter()方法完整展示了如何创建一个 Data Map 并写入数据public class MainActivity extends Activity implements DataApi.DataListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static final String COUNT_KEY com.example.key.count; private GoogleApiClient mGoogleApiClient; private int count 0; ... // Create a data map and put data in it private void increaseCounter() { PutDataMapRequest putDataMapReq PutDataMapRequest.create(/count); putDataMapReq.getDataMap().putInt(COUNT_KEY, count); PutDataRequest putDataReq putDataMapReq.asPutDataRequest(); PendingResultDataApi.DataItemResult pendingResult Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq); } ... }需要注意的关键点路径字符串必须唯一这是从连接任意一端访问该数据单元的依据路径必须以斜线/开头。如果应用需要分层数据应设计一套适合数据结构的分层路径方案例如/count、/settings/preferences、/photo/0用层级结构组织不同类别的数据单元。键的命名建议使用完整限定名如示例中的com.example.key.count避免在不同数据单元之间发生键冲突。离线缓冲机制原文档明确指出如果手机和可穿戴设备没有连接数据会缓冲并在重新建立连接时同步。这是 DataItem 与 Message 的关键差异——消息在设备断开时会返回错误而数据单元则会等待连接恢复后继续同步因此 DataItem 非常适合承载最终一致的状态数据。监听数据元事件前台 Activity 方案数据层连接的一端数据发生改变时通常需要在另一端获知变化。实现一个数据单元事件的监听器即可完成。当前台 Activity 只需在用户使用应用期间感知变化时可以实现DataApi.DataListener接口关于监听方案的取舍详见 处理数据层的事件。下面来自原文档的完整代码展示了一个监听/count路径数据变化的 Activity——当上一节例子中的 count 值发生改变时应用会收到通知public class MainActivity extends Activity implements DataApi.DataListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static final String COUNT_KEY com.example.key.count; private GoogleApiClient mGoogleApiClient; private int count 0; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGoogleApiClient new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); } Override protected void onResume() { super.onStart(); mGoogleApiClient.connect(); } Override public void onConnected(Bundle bundle) { Wearable.DataApi.addListener(mGoogleApiClient, this); } Override protected void onPause() { super.onPause(); Wearable.DataApi.removeListener(mGoogleApiClient, this); mGoogleApiClient.disconnect(); } Override public void onDataChanged(DataEventBuffer dataEvents) { for (DataEvent event : dataEvents) { if (event.getType() DataEvent.TYPE_CHANGED) { // DataItem 改变了 DataItem item event.getDataItem(); if (item.getUri().getPath().compareTo(/count) 0) { DataMap dataMap DataMapItem.fromDataItem(item).getDataMap(); updateCount(dataMap.getInt(COUNT_KEY)); } } else if (event.getType() DataEvent.TYPE_DELETED) { // DataItem 删除了 } } } // 我们的更新 count 的方法 private void updateCount(int c) { ... } ... }这段代码中值得深入理解的四点监听器生命周期Activity 实现了DataApi.DataListener接口在onConnected()回调中调用DataApi.addListener()把自身注册为数据单元事件监听器在onPause()中调用DataApi.removeListener()注销监听并断开连接避免在后台浪费连接资源。注册与注销必须成对出现。事件类型DataEvent.TYPE_CHANGED表示数据单元被创建或修改DataEvent.TYPE_DELETED表示数据单元被删除需要分别处理。按路径过滤通过item.getUri().getPath()判断事件对应的是否是自己关心的路径示例中比较/count避免处理无关数据。读取 Data MapDataMapItem.fromDataItem(item).getDataMap()可以把收到的DataItem还原成DataMap再用getInt(COUNT_KEY)按之前写入的键读取值——这一机制让写入方用 put...()、读取方用 get...()形成完整的键值对同步闭环。后台监听WearableListenerService 方案如果应用需要在后台持续感知数据变化即使界面不可见则应创建一个继承自 WearableListenerService 的 Service。系统负责控制该 Service 的生命周期当需要发送数据元或消息时与 Service 绑定否则解除绑定。创建步骤详见 处理数据层的事件创建继承自WearableListenerService的类重写关心的事件回调如onDataChanged()在 Android manifest 中声明带 intent filter 的 service告知系统允许系统在需要时绑定。public class DataLayerListenerService extends WearableListenerService { private static final String TAG DataLayerSample; Override public void onDataChanged(DataEventBuffer dataEvents) { // 在此处理数据单元的创建、修改、删除事件 for (DataEvent event : dataEvents) { Uri uri event.getDataItem().getUri(); // ... } } }对应的 manifest 声明service android:name.DataLayerListenerService intent-filter action android:namecom.google.android.gms.wearable.BIND_LISTENER / /intent-filter /service由于GoogleApiClient是所有 Google Play services API 的入口在 Service 中处理事件时同样需要构建客户端并连接示例中使用了blockingConnect(30, TimeUnit.SECONDS)进行带超时的阻塞连接。另外需要注意数据层回调权限问题Google Play services 通过 IPC 调用回调方法回调会继承调用进程的权限若需在回调中执行权限操作应使用Binder.clearCallingIdentity()/Binder.restoreCallingIdentity()重置并恢复身份。等待数据层调用的状态PendingResult 的异步与同步用法调用数据层 API如putDataItem()时往往返回 PendingResult 对象——操作在后台排队若不处理也会默默完成但通常需要获知结果。有两种等待方式详见 处理数据层的事件异步调用适用于主 UI 线程避免阻塞界面向PendingResult注册回调操作完成时触发pendingResult.setResultCallback(new ResultCallbackDataItemResult() { Override public void onResult(final DataItemResult result) { if(result.getStatus().isSuccess()) { Log.d(TAG, Data item set: result.getDataItem().getUri()); } } });同步调用适用于后台 Service 的独立线程如WearableListenerService调用await()阻塞至请求完成DataItemResult result pendingResult.await(); if(result.getStatus().isSuccess()) { Log.d(TAG, Data item set: result.getDataItem().getUri()); }判断result.getStatus().isSuccess()是确认数据单元是否写入成功的标准做法成功后可进一步从结果中取出系统生成的DataItem及其 URI。连接机制与多设备同步正如开头架构图所示Android Wear 数据层运行在一个包含手持设备、可穿戴设备与云节点的网络中系统会在设备间网络上设置云节点数据不仅同步到直连设备也会同步到经云节点含 Wi-Fi 接入的可穿戴设备连接的其他设备。因此在多手表场景下一端写入的数据单元会出现在所有已连接设备上——例如手机端保存一条笔记它会自动出现在用户的 Wear 设备上。这一机制与 DataItem 的断线缓冲特性叠加构成了数据层最终一致、自动同步的核心体验无论设备当前经蓝牙直连、Wi-Fi 连接云节点还是暂时离线数据单元都会在连接可用后完成同步。小结围绕 同步数据单元本文完整覆盖了DataItem 的组成Payload ≤ 100KB、唯一且以/开头的 Path与适用场景基于PutDataRequest.setData()的原始字节流程以及更推荐的PutDataMapRequest DataMap 键值对流程在前台 Activity 中通过DataApi.DataListener监听TYPE_CHANGED/TYPE_DELETED事件并用DataMapItem反向读取数据在后台通过WearableListenerService manifest intent filter 持续监听通过PendingResult的setResultCallback()与await()获取调用状态多节点网络下的云节点同步与断线缓冲机制。若需进一步探索完整数据层方案可继续阅读仓库中同一模块的姊妹章节访问可穿戴数据层GoogleApiClient 的构建与连接细节、传输资源超出 100KB 的二进制数据、发送与接收消息单向 RPC 式通信以及 处理数据层的事件监听方案的完整对比。赞分享文档教程移动开发【免费下载链接】android-training-course-in-chineseAndroid官方培训课程中文版项目地址https://gitcode.com/gh_mirrors/an/android-training-course-in-chinese点击查看免费下载相关推荐LexVec Python接口详解3行代码集成强大词向量到你的NLP系统LexVec Python接口详解3行代码集成强大词向量到你的NLP系统 LexVec是一款高性能的词向量模型类似于word2vec和GloVe在多个NLOpenSearch 1.3.4 版本发布解析依赖安全升级、ingest-attachment 文档抽取加固与客户端断连崩溃修复OpenSearch 1.3.4 版本发布解析依赖安全升级、ingest attachment 文档抽取加固与客户端断连崩溃修复 本篇技术文章围绕 OpenS文档教程移动开发Android 可穿戴应用开发实战从 Notification 同步到数据层与表盘android-training-course-in-chineseAndroid 可穿戴应用开发实战从 Notification 同步到数据层与表盘android training course in chinese 本文档教程移动开发上一篇3分钟掌握B站缓存视频转换m4s-converter无损合并全攻略下一篇3分钟极速拯救B站缓存视频m4s转MP4完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表