Android 建立手机与手表数据同步机制总结

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 建立手机与手表数据同步机制总结

时间: 2024-12-20 14:38:30

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

多终端数据同步机制设计(二)

多终端数据同步机制设计(二) Intro 如果您没有看上一篇文章,建议您先移步到这里查看第一部分 上一次主要解决了基本的数据增量同步的问题,但仍然存在一些问题. 可能存在的主要问题: 大数据量传输时,数据在传输过程出现部分丢失,数据不完整 超大数据量需要同步,导致响应时间过长而导致连接超时 针对以上可能出现的这两个问题,需要对数据进行校验并且数据量超过一定量时进行分批量传输, 本文将着手解决 数据校验 和 数据分批次传输 这两个问题. 同步流程概览 结合之前的同步流程,加上数据校验和分批次传输数

多终端数据同步机制设计

多终端数据同步机制设计(一) Intro 因为项目需要,需要设计一个多终端数据同步的机制, 需要满足以下条件: 1. 多个终端数据操作及同步 2. 每次同步的时候只拉取需要同步的数据,且数据不能存在丢失 3. 尽可能少的调用服务器端接口 同步流程 整体同步流程 我想仿照Git数据同步的方式来进行数据同步,于是放着Git同步的流程来进行设计,首先每次提交会有一个版本号,另外每次提交之前应尽可能先从服务器端拉取数据, 保证客户端的数据是最新的情况下再进行提交本地的修改.按照Git的方式来进行数据同步

[android数据库同步]【架构】一种Android界面数据同步刷新机制

我们来谈谈客户端界面的数据同步问题. 界面数据同步的需求 比如,下面的AB两个界面中都显示了学生Leslie的信息,当我们在A界面修改学生学号时,我们希望回到B界面时,学生的信息也能跟着改变,才能保证业务数据的正确和一致性. 这就涉及到数据的同步和刷新问题. 主界面显示了学生和老师的信息 另一个界面也显示了学生的信息 刷新数据时都要从数据源再次请求数据吗? 如今手机应用的数据几乎都来自网络(或者本地数据库).假如我们在A界面上修改了学生的信息并同步到网络,若回到B界面需要刷新该学生的信息,再次调

Android中的GraphicBuffer同步机制-Fence

Fence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步.那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况,尤其是CPU,GPU和HWC之间的同步,另外它还可以用于多个时间点之间的同步.GPU编程和纯CPU编程一个很大的不同是它是异步的,也就是说当我们调用GL command返回时这条命令并不一定完成了,只是把这个命令放在本地的command buffer里.具体什么时候这条GL command被真正执行完毕CPU是不知道的,除非CPU使用g

在Android Wear开发中使用蓝牙调试同时操作手机与手表设备

在开发Android Wear应用过程中需要对手表和手机进行同时操作,可以通过蓝牙同时对手机和手表进行操作. 1 打开手表和手机的调试设置 打开手机的usb调试 打开手表设置的开发者选项,选中Debug over Bluetooth   如果是首次使用手表调试,需要在Setting中找到About,单击7次打开开发者选项 2 连接手表到开发工具 在手机端打开Android Wear App,进入Setting,选中Debugging over Bluetooth,会发现当前状态是 <span s

计算机底层知识拾遗(七)页缓存数据同步和页回收机制

这篇说说Linux的页缓存数据同步和页回收机制.数据同步和页回收是两个独立的概念,数据同步处理的是内存/缓存的数据和后备设备的数据一致问题,页回收处理的是在内存空间不足时如何回收已分配的物理内存页,来获得足够空间分配干净页,支持优先级更高的工作.数据同步在任意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发. 数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件中去.有两种方式可以调用数据同步 1. 周期性的调用,主要是pdflush机制 2. 强制调用,比如调用sync,

如何将Android设备与Mac同步?SyncMate实时数据同步教程

由于Apple没有提供与Android设备同步的任何内置选项,因此在Mac和Android之间保持数据同步可能会非常令人头疼.您需要第三方应用才能在Mac和Android之间保持数据同步.其中一个应用程序是SyncMate,这是一个功能强大的工具,可以使Mac和Android上的数据保持最新状态.下面我们逐步介绍Mac和Android设备之间的数据同步过程,以方便您使用. 1.下载并安装SyncMate免费版到您的Mac.安装SyncMate后,启动它以显示主窗口. 2.在左侧窗格中单击"添加新

数据缓存机制-数据同步

在数据同步方式中,对于一些无法监听数据变更,或者数据变更太频繁的,我采用了定时器定时更新缓存数据的方式,例: @Scheduled(fixedRate = 1000) public void getCurrentDate() { List<Map<String, Object>> instanceList = assemblyService.getInstanceList(); for (Map<String, Object> instance : instanceLi

Android系统的五种数据存储形式(二)

之前介绍了Android系统下三种数据存储形式,今天补充介绍另外两种,分别是内容提供者和网络存储.有些人可能认为内存提供者和网络存储更偏向于对数据的操作而不是数据的存储,但这两种方式确实与数据有关,所以这里还是将这两种形式简要的说明一下. Content Provider: Content Provider,中文名是内存提供者,Android四大组件之一,内容提供者是应用程序之间共享数据的接口,以数据库形式存入手机内存,可以共享自己的数据给其他应用使用.之所以需要设计一个单独的控件来操作数据,是