Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收
本节由介绍3种数据的发送接收:
1.Data Items : 比特类型数据,限制100KB以内
2.Assets : 资源类型数据,大小无上限
3.Message : 发送消息,触发指令
http://developer.android.com/training/wearables/data-layer/data-items.html
1.Syncing Data Items
DataItem定义了同步手机和手表的数据接口.一个DataItem对象一般包括下面2个部分:
- 负载 : 一个比特类型数组,支持任意实现了序列化接口的对象.负载最大是100KB.
- 路径 : 一个唯一的字符串,且必须以"/"斜杠作为开头,如"/path/to/data"
一般来说是不需要自己实现DataItem接口的,而是通过以下方式:
- 创建一个PutDataRequest对象,用一个唯一的字符串ID来定义.
- 调用setData()方法将负载数据传入
- 调用DataApi.putDataItem()请求系统来构建数据单元
- 当请求数据单元时,系统会返回实现了DataItem接口的对象
以上的方式并非最佳的选择,还可以通过DataMap的方式来实现,这类似于Bundle.
Sync Data with a Data Map
因为DataMap的方式是用Bundle实现的,所以它帮我们解决了序列化问题,并且可以使用键值对的方式来操控数据.
使用方法
- 构造一个PutDataMapRequest对象,设置唯一ID.
- 调用PutDataMapRequest.getDataMap()来获取一个数据map.
- 用put...()方法来设置所需的数据.
- 调用PutDataMapRequest.asPutDataRequest()来获取一个PutDataRequest对象.
- 调用DataApi.putDataItem()请求系统传递数据.
注意:此时手表和手机若未连接,则会缓存在发送端,待到两端连接时再进行同步.
代码样例
private void syncData() {PutDataMapRequest dataMap = PutDataMapRequest.create("/count");dataMap.getDataMap().putInt(COUNT_KEY, count++);PutDataRequest request = dataMap.asPutDataRequest();PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(mGoogleApiClient, request); }
Listen for Data Item Events
当任意一端的数据发生变化时,这时候如果想通知到另外一端,可以通过监听数据改变接口来实现:
代码样例
@Override public void onDataChanged(DataEventBuffer dataEvents) {for (DataEvent event : dataEvents) {if (event.getType() == DataEvent.TYPE_DELETED) {Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());} else if (event.getType() == DataEvent.TYPE_CHANGED) {Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri());}} }
http://developer.android.com/training/wearables/data-layer/assets.html
2.Transferring Assets
若想通过蓝牙发送较大的二进制数据块,例如图片,则需要将数据绑定到Asset对象上.
Assets自动地处理了数据缓存的阻止重发和保存蓝牙数据带宽.一个通用模式来处理手机应用下载图片,再处理成适当的尺寸,最后转换成asset发送到手表.
注意:数据单元Data Item被限制在100KB以内,而Assets则是没有限制的.但是传输大数据量的Assets会影响到用户体验,所以若是迫不得已必须传较大的Assets,要多测试.
Transfer an Asset
构建好了Assets,则可以通过PutDataRequest或PutDataMapRequest的方式传递数据
PutDataRequest:
private void transferAsset{Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);Asset asset = createAssetFromBitmap(bitmap);PutDataRequest request = PutDataRequest.create("/image");request.putAsset("profileImage", asset);Wearable.DataApi.putDataItem(mGoogleApiClient, request); }
PutDataMapRequest:
private void transferAsset{Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);Asset asset = createAssetFromBitmap(bitmap);PutDataMapRequest dataMap = PutDataMapRequest.create("/image");dataMap.getDataMap().putAsset("profileImage", asset)PutDataRequest request = dataMap.asPutDataRequest();PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(mGoogleApiClient, request); }
Receive assets
@Override public void onDataChanged(DataEventBuffer dataEvents) {for (DataEvent event : dataEvents) {if (event.getType() == DataEvent.TYPE_CHANGED &&event.getDataItem().getUri().getPath().equals("/image")) {DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");Bitmap bitmap = loadBitmapFromAsset(profileAsset);// Do something with the bitmap }} }public Bitmap loadBitmapFromAsset(Asset asset) {if (asset == null) {throw new IllegalArgumentException("Asset must be non-null");}ConnectionResult result =mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS);if (!result.isSuccess()) {return null;}// convert asset into a file descriptor and block until it's readyInputStream assetInputStream = Wearable.DataApi.getFdForAsset(mGoogleApiClient, asset).await().getInputStream();mGoogleApiClient.disconnect();if (assetInputStream == null) {Log.w(TAG, "Requested an unknown Asset.");return null;}// decode the stream into a bitmapreturn BitmapFactory.decodeStream(assetInputStream); }
http://developer.android.com/training/wearables/data-layer/messages.html
3.Sending and Receiving Messages
可以通过MessageApi来发送以下两种数据:
- 任意类型的数据
- 拥有唯一键值对的消息动作
与DataItem的双向同步不同,message是单向的.Message通过单向的连接发送到另一端,这有利于远程调用(RPC - remote procedure calls).
Send a Message
以下是一个发送消息启动Activity的样例,在发送消息时,会阻塞线程,直到消息送达或者超时.
Node node; // the connected device to send the message to GoogleApiClient mGoogleApiClient; public static final START_ACTIVITY_PATH = "/start/MainActivity"; ...SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient, node, START_ACTIVITY_PATH, null).await();if (!result.getStatus().isSuccess()) {Log.e(TAG, "ERROR: failed to send Message: " + result.getStatus());}
以下是获取所有的和Android Wear应用相连接的节点.
private Collection<String> getNodes() {HashSet <String>results = new HashSet<String>();NodeApi.GetConnectedNodesResult nodes =Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();for (Node node : nodes.getNodes()) {results.add(node.getId());}return results; }
Receive a Message
以下是接收消息的例子,与上一个发送消息的例子对应.在处理接收到的消息之前,需要使用MessageApi.addListener()注册监听器.具体在其他章节中有讲述.
@Override public void onMessageReceived(MessageEvent messageEvent) {if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) {Intent startIntent = new Intent(this, MainActivity.class);startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(startIntent);} }
Android Wear开发 - 数据通讯 - 第二节 : 数据的发送与接收相关推荐
- 《Android 游戏开发大全(第二版)》——6.4节角色扮演游戏
本节书摘来自异步社区<Android 游戏开发大全(第二版)>一书中的第6章,第6.4节角色扮演游戏,作者吴亚峰 , 于复兴 , 杜化美,更多章节内容可以访问云栖社区"异步社区& ...
- ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发
为什么80%的码农都做不了架构师?>>> ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发 前言:本篇主要讲述数据访问层的开发, ...
- 第四章第二节数据资产盘点-数据资产盘点方法伦
第四章第二节数据资产盘点-数据资产盘点方法伦 数据资产盘点可以通过业务角度的自上而下演绎和数据角度的自下而上归纳对数据资产进行盘点,编制数据资产目录 ,如图所示: 自上而下的演绎,是确保数据资产目录可 ...
- Android Wear开发浅析(一)
Android Wear究竟是什么? Android Wear和手机是完全不同的设计理念:手机大多数情况下,都是用户去操作,去触发里面的应用:而手表则是"用户被动"的,用户越少感觉 ...
- Android Wear 开发 (一)
[转载博客](http://blog.csdn.net/hehaitao074/article/details/50675618) Android Wear究竟是什么? Android Wear和手机 ...
- 第一方数据,第二方数据,第三方数据,都是什么意思?
数据无处不在--我们每天创造超过2.5艾字节(exabytes)的数据,研究人员预测到2025年将会有163泽字节(zettabytes)的数据.此外,还有许多种类的数据与企业有关.我们有第一方,第三 ...
- STM32之USART:RXD和TXD管脚互换、接收和发送的电平极性反转、支持数据高位与低位反序发送或接收
1:支持RXD和TXD管脚互换 在外接RS232芯片将RXD和TXD两根线接反,如果大家知道USART的TXD和RXD管脚可以互换,那么在连接外设RS232芯片时,如果发生错误,就不必再修改硬件,只需 ...
- 【Android FFMPEG 开发】FFMPEG 解码 AVPacket 数据到 AVFrame ( AVPacket-解码器 | 初始化 AVFrame | 解码为 AVFrame 数据 )
文章目录 I . FFMPEG 解码 AVPacket 数据到 AVFrame 前置操作 II . FFMPEG 解码 AVPacket 数据到 AVFrame 流程 III . FFMPEG 发送 ...
- 第二节:数据仓库系统的体系结构
1:引言 上一篇介绍了数据仓库的定义:面向主题的,集成的,不可修改的,随时间不断变化的用来更好的为企业或组织决策分析的数据集合. 数据仓库是区别于传统操作型数据库的数据集合,主要应用于分析型数据操 ...
最新文章
- 华为云携手秒拍,云+AI助力短视频加速发展
- python安装mysqlclient报错_Centos 6 – sudo在为Python 3.4安装mysqlclient时...
- 1.2 线性回归与梯度下降-机器学习笔记-斯坦福吴恩达教授
- 学会这9招,你也能成为演讲高手
- 更便捷:阿里云DCDN离线日志转存全新升级
- 不知道如何选择的时候,付诸行动比选择更重要
- docker构建容器服务
- 天津理工大学计算机调剂信息,天津理工大学2020考研调剂信息
- Python使用tkinter的Treeview组件实现表格功能
- 网络编程之 keepalive(zz)
- 考上MBA,为自己装一双翅膀
- 能搜python题的软件_中国大学MOOC的APP用Python玩转数据期末考试搜题公众号答案...
- 基于Vue2.0+Vuex+Axios+NodeJs+Express+MySQL实现京东移动web商城
- LIS和LCS LCIS
- MySQL5.5安装和navicat安装配置图解
- arcgis拼接影像
- ubuntu 16.04和window双系统 启动项顺序修改
- opengles特效之飘扬的旗帜
- 进阶篇:2.1)DFMA实施障碍和关键
- 【天光学术】学前教育论文:幼儿园区角活动中存在的问题及有效对策(节选)
热门文章
- OpenGL学习入门之VS2010环境配置 [转]
- KernelIoControl和OEMIoControl的分析和使用(作者:wogoyixikexie@gliet)
- 存储和存储服务器的游戏
- 反弹和补遗:再论Bjarne Stroustrup的基于对象的含义
- Appium移动自动化框架原理
- 设置在桌面上不显示计算机,怎么在桌面上显示我的电脑 我的电脑桌面不显示怎么办...
- iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态
- 更改Xamarin Android App名称
- SQLite的sqlite_master表
- 弹出页(指定高度,自由拖动,点击空白包括状态栏触发)