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 ready
InputStream 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 bitmap
return 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 Wear开发 - 卡片通知 - 第二节 : 自定义Wear卡片样式
一.前言说明 在上一节添加Android Wear通知特性我们实现了简单的Android Wear卡片拓展,但是默认提供给我们的多张卡片只能实现简单的文字展示,如果想要自定义布局,添加图片等等,则需要 ...
- Android Wear开发 - 卡片通知 - 第一节 : 添加Android Wear通知特性
一. 前言说明 Android Wear大部分显示形式是卡片的形式,而最简单地支持Android Wear方式就是用通知**Notification**.而实现最简单的,非高度自定义的通知,则只需要在 ...
- Android Wear开发
Android Wear从2014年3月发布到现在已经从1.0发展到2.0(目前还没正式发布).其产品定位也发化了巨大变化,因为Android Wear 1.0通讯方式只有蓝牙,限定了系统,比较依赖手 ...
- Android Wear 开发入门
大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下An ...
- IDEA搭建Android wear开发环境,Android wear,I'm comming!
随着google公布了android wear这个东西.然后又有了三星的gear,LG的G watch以及moto 360,苹果由公布了apple watch.未来可能在智能手表行业又有一场战争. 当 ...
- Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)
之所以将打包这一特殊的内容作为数据通讯的第零节,是因为如果没有通过配置打包的一些信息,则没有办法将手机端应用和手表端应用连接起来,则无法继续进行接下来的数据通讯的开发. 以下依然只针对Eclipse平 ...
- Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)
一. 前言 背景 一开始笔者在研究数据发送与接收的时候,看到Wear数据类DataMap除了可以put基本类型外,还有个fromBundle方法来构建一个DataMap对象.所以一口气的将原本功能上的 ...
- Android Wear开发 - 数据通讯 - 第一节 : 连接数据层
http://developer.android.com/training/wearables/data-layer/accessing.html Accessing the Wearable Dat ...
- Android Wear开发 - 数据通讯 - 第三节 : 事件处理
http://developer.android.com/training/wearables/data-layer/events.html 以下是本人在学习官方开发文档时的笔记,主要是翻译为主,并在 ...
随机推荐
- apache不解析php文档?提示需要下载(转)
在httpd.cong中 LoadModule php5_module modules/libphp5.so #这一行php5安装的时候就已经自动添加上了 AddType application/x- ...
- 使用DBOutputFormat把MapReduce产生的结果集导入到mysql中
数据在HDFS和关系型数据库之间的迁移,主要有以下两种方式 1.按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入 2.采用JDBC的方式进行导入 MapReduce默认提供了DBI ...
- MySQL Handling of GROUP BY--官方文档
In standard SQL, a query that includes a GROUP BY clause cannot refer to nonaggregated columns in th ...
- Dapper Use For Net
Dapper.Net by example januari 6, 2012 When the team behind StackOverflow released the mini-ORM Dappe ...
- Python中sys.argv[]的用法
类似bash中的$0, $1, $2... sys.argv[0]:文件名 sys.argv[1]:第一个参数 sys.argv[2]:第二个参数 import sys print "The ...
- codevs1024一塔湖图(丧心病狂的建图)
/* 丧心病狂的最短路 关键是建图 根据题目中给的路 拆出节点来 建图 (i,j) -->(j-1)*n+i 然后根据障碍 把死路 湖覆盖的dis改变成极大值 然后Floyd 然后 然后就没有然 ...
- 国人编写的开源 .net Ioc 框架——My.Ioc 简介
My.Ioc 是作者开发的一款开源 IoC/DI 框架,下载地址在此处.它具有下面一些特点: 高效 在实现手段上,My.Ioc 通过使用泛型.缓存.动态生成代码.延迟注册.尽量使用抽象类而非接口等方式 ...
- WCF 生产json对外的接口
调用wcf public ActionResult Index() { ViewBag.Message = "修改此模板以快速启动你的 ASP.NET MVC 应用程序."; WC ...
- mybatis for .net
MyBatis For .NET学习笔记:开篇 http://chenkai.blog.51cto.com/2023960/763806 MyBatis For .NET学习笔记[2]:配置环境 ht ...
- oracle中不曾熟悉的 to_char、to_number(未完待续)
十进制 十六进制88 58 用法一:Converts a HEX number to o FLOAT (转换一个十六进制数的浮标) SQL> sele ...