Android Wear 数据同步机制总结

当手机与手表建立蓝牙连接之后。数据就能够通过Google Play Service进行传输。

同步数据对象Data Item

DataItem提供手机与手表数据存储的自己主动同步,一个DataItem对象由其创建者与路径组成的URI所确定。一个DataItem对象为手机和手表提供了一个数据通路,开发人员通过改变指定的DataItem实现手机和手表的数据自己主动同步。

訪问数据层API

DataItem能够提供手机和手表数据的保存,改变该对象的操作则依赖数据层API(the Data Layer APIs)。也就是说,在改变DataItem数据之前,须要先訪问数据层,获得一个GoogleApiClient实例,从而能够使用数据层API。

以下是实例化GoogleApiClient的代码

GoogleApiClient mGoogleAppiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(new ConnectionCallbacks() {
@Override
public void onConnected(Bundle connectionHint) {
Log.d(TAG, "onConnected: " + connectionHint);
// Now you canuse the data layer API
}
@Override
public void onConnectionSuspended(int cause) {
Log.d(TAG, "onConnectionSuspended: " + cause);
}
})
.addOnConnectionFailedListener(new OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult result) {
Log.d(TAG, "onConnectionFailed: " + result);
}
})
.addApi(Wearable.API)
.build();

在使用数据层Api的之前。须要先调用connect()方法。假设成功则会回调onConnected()方法,否则回调onConnectionFailed()。

同步DataItems

GoogleApiClient连接成功后。就能够通过DataItem进行数据同步了。

一个DataItem包括连个部分,一个是Payload,这是一个字节数组,能够通过序列化或者反序列化保存须要的数据类型和对象;还有一个是Path,这是一个唯一的字符串,由反斜杠开头,差别不同的DataItem。

         通常在开发过程中是使用DataMap类实现DataItem接口。相似Bundle键值对的存储方式。

         以下是使用的DataMap步骤:

1、  创建PutDataMapRequest对象,为DataItem设置path值;

2、  使用put…()方法为DataMap设置须要的数据;

3、  调用PutDataMapRequest.asPutDataRequest()创建PutDataRequest对象。

4、  调用DataApi.putDataItem()请求系统创建DataItem。

假设此时手机和手表没有建立连接。则会将数据保存在Buffer中,等下次连接后会发送到还有一方。

以下是使用DataMap创建DataItem的方法


PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
dataMap.getDataMap().putInt(COUNT_KEY, count++);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);

监听数据层事件

因为数据层同步或发送的数据连接手机和手表,所以常常须要获知何时DataItem被创建以及手机与手表什么时候连接或断开等事件。

监听数据层时间能够使用两种方式,一种是继承WearableListenerService。一种是在Activity中实现DataApi.DataListener。不管使用两种方式的哪种。能够重写其须要的回调方法运行对应的操作。

1、  使用WearableListenerService

该service在手机和手表端都能够使用,假设在一方不须要监听数据层时间能够不适用该服务。

比如,能够在手机端接收和设置DataItem。然后在手表端实现该服务,监听数据层的事件,从而改动手表的UI。

WearableListenerService提供回调接口onDataChanged()处理DataItem的变化,当DataItem被创建、更改或删除,手机和手表的该事件将被触发。

以下是使用WearableListenerService的方法

1、  创建一个类继承WearableListenerService;

2、  监听须要的事件,如onDataChanged()。

3、  在配置文件里声明一个intentfilter通知系统监听WearableListenerService,这样在系统须要的时候就会绑定WearableListenerService。

以下代码是一个简单的WearableListenerService实现。


public class DataLayerListenerService extends WearableListenerService {

    private static final String TAG = "DataLayerSample";
private static final String START_ACTIVITY_PATH = "/start-activity";
private static final String DATA_ITEM_RECEIVED_PATH = "/data-item-received"; @Override
public void onDataChanged(DataEventBuffer dataEvents) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "onDataChanged: " + dataEvents);
}
final List events = FreezableUtils
.freezeIterable(dataEvents); GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.build(); ConnectionResult connectionResult =
googleApiClient.blockingConnect(30, TimeUnit.SECONDS); if (!connectionResult.isSuccess()) {
Log.e(TAG, "Failed to connect to GoogleApiClient.");
return;
} // Loop through the events and send a message
/ to the node that created the data item.
for (DataEvent event : events) {
Uri uri = event.getDataItem().getUri(); // Get the node id from the host value of the URI
String nodeId = uri.getHost();
// Set the data of the message to be the bytes of the URI.
byte[] payload = uri.toString().getBytes(); // Send the RPC
Wearable.MessageApi.sendMessage(googleApiClient, nodeId,
DATA_ITEM_RECEIVED_PATH, payload);
}
}
}

以下代码是配置文件里声明的intentfilter


<service android:name=".DataLayerListenerService">
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>

使用DataApi.DataListener监听数据层

假设不须要后台长时间进行监听,能够使用DataApi.DataListener进行监听。以下是使用该方式的方法。

1、  使用DataApi.DataListener接口

2、  在onCreate中创建 GoogleApiClient。訪问数据层API

3、  在onStart中调用connect()连接Google PlayService

4、  但连接上GooglePlay Service后,系统调用onConnected(),通知Google Play service该activity监听数据层事件

5、  在onStop中调用DataApi.removeListener()

6、  实现 onDataChanged()回调

以下是使用DataApi.DataListener监听数据层事件的代码


public class MainActivity extends Activity implements
DataApi.DataListener, ConnectionCallbacks, OnConnectionFailedListener { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
} @Override
protected void onStart() {
super.onStart();
if (!mResolvingError) {
mGoogleApiClient.connect();
}
} @Override
public void onConnected(Bundle connectionHint) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Connected to Google Api Service");
}
Wearable.DataApi.addListener(mGoogleApiClient, this);
} @Override
protected void onStop() {
if (null != mGoogleApiClient && mGoogleApiClient.isConnected()) {
Wearable.DataApi.removeListener(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
}
super.onStop();
} @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());
}
}
}

获取手机通知大家的服务

Android提供了一个服务类接口NotificationListenerService,继承该服务,能够获取手机中应用发起的通知。在配置文件里须要加入例如以下声明和权限


<service android:name=".NotificationListener"
android:label="@string/service_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>

这样在系统设置中会出现一个是否同意该服务捕获通知的选项。在设置--安全与隐私--通知读取权限

该服务有两个抽象方法须要实现,各自是当有通知发起与通知被销毁,都会触发其回调方法。


public class NotificationCollectorService extends NotificationListenerService {  

    @Override
public void onNotificationPosted(StatusBarNotification sbn) {
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
}
}

也就是说当系统发现某应用产生通知或者用户删除某通知,都会回调该服务的这两个函数。函数的參数StatusBarNotification包括着该通知的详细信息。

假设是在Android Wear开发中。使用该方法捕获手机的通知,然后同步到手表中。就是使用该服务进行的中转。

通知同步

接收到的通知以StatusBarNotification对象形式传递给回调函数onNotificationPosted(),

调用StatusBarNotification对象的公共方法,分别取出StatusBarNotification中的PackageName、Tag、Id、notification对象和PostTime。通过这些值去创建DataItem。

Android 建立手机与手表数据同步机制总结的更多相关文章

  1. Android 12(S) 图像显示系统 - GraphicBuffer同步机制 - Fence

    必读: Android 12(S) 图像显示系统 - 开篇 一.前言 前面的文章中讲解Android BufferQueue的机制时,有遇到过Fence,但没有具体讲解.这篇文章,就针对Fence这种 ...

  2. 23、redis如何实现主从复制?以及数据同步机制?

    redis主从复制 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或 ...

  3. MySQL-技术专题-MySQL主从架构以及[半同步机制]模式大全

    MySQL的主从复制 一般在大规模的项目上,都是使用MySQL的复制功能来创建MySQL的主从集群的. 主要是可以通过为数据库服务器配置一个或多个备库的方式来进行数据同步. 复制的功能不仅有利于构建高 ...

  4. Zookeeper的选举机制和同步机制超详细讲解,面试经常问到!

    前言 zookeeper相信大家都不陌生,很多分布式中间件都利用zk来提供分布式一致性协调的特性.dubbo官方推荐使用zk作为注册中心,zk也是hadoop和Hbase的重要组件.其他知名的开源中间 ...

  5. Redis面试热点工程架构篇之数据同步

    温馨提示 更佳阅读体验:[决战西二旗]|Redis面试热点之工程架构篇[2] 前言 前面用了3篇文章介绍了一些底层实现和工程架构相关的问题,鉴于Redis的热点问题还是比较多的,因此今天继续来看工程架 ...

  6. Android利用Fiddler进行网络数据抓包,手机抓包工具汇总

    Fiddler抓包工具 Fiddler抓包工具很好用的,它可以干嘛用呢,举个简单例子,当你浏览网页时,网页中有段视频非常好,但网站又不提供下载,用迅雷下载你又找不到下载地址,这个时候,Fiddler抓 ...

  7. Android利用Fiddler进行网络数据抓包,手机抓包工具汇总,使用mono运行filddler

    Fiddler抓包工具 Fiddler抓包工具很好用的,它可以干嘛用呢,举个简单例子,当你浏览网页时,网页中有段视频非常好,但网站又不提供下载,用迅雷下载你又找不到下载地址,这个时候,Fiddler抓 ...

  8. Android 音视频同步机制

    一.概述 音视频同步(avsync),是影响多媒体应用体验质量的一个重要因素.而我们在看到音视频同步的时候,最先想到的就是对齐两者的pts,但是实际使用中的各类播放器,其音视频同步机制都比这些复杂的多 ...

  9. redis多实例与主从同步及高级特性(数据过期机制,持久化存储)

    redis多实例 创建redis的存储目录 vim /usr/local/redis/conf/redis.conf #修改redis的配置文件 dir /data/redis/ #将存储路径配置修改 ...

随机推荐

  1. 为什么用freemarker视图?

    在java领域,表现层技术主要有三种:jsp.freemarker.velocity. jsp是大家最熟悉的技术优点:1.功能强大,可以写java代码2.支持jsp标签(jsp tag)3.支持表达式 ...

  2. 推荐ThinkJS

    之前在学习node.js时,写过一些例子和demo,偶尔也会有人发email问我node.js的一些问题.因为是二三年前写的东西,当时使用的第三方库和node.js的版本跟最新的可能有所不同甚至比较大 ...

  3. Eclipse给安卓应用签名

  4. 《MySQL Workbench数据建模与开发》

    <MySQL Workbench数据建模与开发> 基本信息 原书名:MySQL Workbench:Data Modeling & Development 原出版社: McGraw ...

  5. 轻松看懂Java字节码

    java字节码 计算机只认识0和1.这意味着任何语言编写的程序最终都需要经过编译器编译成机器码才能被计算机执行.所以,我们所编写的程序在不同的平台上运行前都要经过重新编译才能被执行. 而Java刚诞生 ...

  6. 洛谷 P3386 【模板】二分图匹配

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  7. Swift3.0:NSURLConnection的使用

    一.介绍 应用中也不必不可少的会使用网络通信,增强客户端和服务器的交互,可以使用NSURLConnection实现http通信. NSURLConnection提供了异步请求和同步请求两种请求方式.同 ...

  8. “秘书九段的故事”,要学会给自己制定一个工作N段或者技术N段

    总经理要求秘书安排次日上午九点开一个会议.在这件事下,什么是任务?什么是结果? 通知到所有参会的人员,然后秘书自己也参加会议来做服务,这是“任务”.但我们想要的结果是什么呢?下面是一至九段秘书的不同做 ...

  9. JS获取当前网页内容,创建文件并下载,URL.createObjectURL和URL.revokeObjectURL

    有时候需要在前端侧对于动态生成的内容进行下载,比如页面上某一段文本信息,再比如对页面进行分享的时候,希望分享图片是页面内容的实时截图,此时,这个图片就是动态的,纯HTML显然是无法满足我们的需求的,借 ...

  10. 我对android 软件栈了解

    android 软件栈如图所示: Android平台的核心是Linux内核,它负责设备驱动程序.资源访问.电源管理和完成其他操作系统的职责.提供的设备驱动程序包括显示器.照相机,键盘.WiFi.闪存. ...