Android 同步數(shù)據(jù)單元

2018-08-02 17:53 更新

編寫(xiě):wly2014 - 原文: http://developer.android.com/training/wearables/data-layer/data-items.html

DataItem是指系統(tǒng)用于同步手持設(shè)備與可穿戴設(shè)備間數(shù)據(jù)的接口。一個(gè)DataItem通常包括以下幾點(diǎn):

  • Pyload - 一個(gè)字節(jié)數(shù)組,我們可以用來(lái)設(shè)置任何數(shù)據(jù),讓我們的對(duì)象序列化和反序列化。Pyload的大小限制在100k之內(nèi)。

  • Path - 唯一且以前斜線開(kāi)頭的字符串(如:"/path/to/data")。

通常不直接實(shí)現(xiàn)DataItem,而是:

  1. 創(chuàng)建一個(gè)PutdataRequest對(duì)象,指明一個(gè)字符串路徑以唯一確定該 item。
  2. 調(diào)用setData())方法設(shè)置Pyload。
  3. 調(diào)用DataApi.putDataItem()方法,請(qǐng)求系統(tǒng)創(chuàng)建數(shù)據(jù)元。
  4. 當(dāng)請(qǐng)求數(shù)據(jù)元的時(shí)候,系統(tǒng)會(huì)返回正確實(shí)現(xiàn)DataItem接口的對(duì)象。

然而,我們建議使用Data Map來(lái)顯示裝在一個(gè)易用的類(lèi)似Bundle接口中的數(shù)據(jù)元,而不是用setData()來(lái)處理原始字節(jié)。

用 Data Map 同步數(shù)據(jù)

使用DataMap類(lèi),將數(shù)據(jù)元處理為 Android Bundle的形式,因此會(huì)完成對(duì)象的序列化和反序列化,我們就可以以鍵值對(duì)(key-value)的形式操縱數(shù)據(jù)。

如何使用data map:

  1. 創(chuàng)建一個(gè) PutDataMapRequest對(duì)象,設(shè)置數(shù)據(jù)元的路徑。

    Note: 數(shù)據(jù)元的路徑字符串是唯一確定的,這樣能夠使我們從連接任意一端訪問(wèn)數(shù)據(jù)元。路徑須以前斜線開(kāi)始。如果我們想在應(yīng)用中使用分層數(shù)據(jù),就要?jiǎng)?chuàng)建一個(gè)適合數(shù)據(jù)結(jié)構(gòu)的路徑方案。

  2. 調(diào)用PutDataMapRequest.getDataMap())獲取一個(gè)我們可以使用的data map 對(duì)象。
  3. 使用put...()方法,如:putString(),為data map設(shè)置數(shù)據(jù)。
  4. 調(diào)用PutDataMapRequest.asPutDataRequest())獲得PutDataRequest對(duì)象。
  5. 調(diào)用 DataApi.putDataItem() 請(qǐng)求系統(tǒng)創(chuàng)建數(shù)據(jù)元。

    Note: 如果手機(jī)和可穿戴設(shè)備沒(méi)有連接,數(shù)據(jù)會(huì)緩沖并在重新建立連接時(shí)同步。

接下的例子中的increaseCounter()方法展示了如何創(chuàng)建一個(gè)data map,并設(shè)置數(shù)據(jù):

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();
        PendingResult<DataApi.DataItemResult> pendingResult =
                Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq);
    }

    ...
}

有關(guān)控制 PendingResult 對(duì)象的更多信息,請(qǐng)參見(jiàn) Wait for the Status of Data Layer Calls 。

監(jiān)聽(tīng)數(shù)據(jù)元事件

如果數(shù)據(jù)層連接的一端數(shù)據(jù)發(fā)生改變,我們很可能想要被告知在連接的另一端發(fā)生的任何改變。我們可以通過(guò)實(shí)現(xiàn)一個(gè)數(shù)據(jù)元事件的監(jiān)聽(tīng)器來(lái)完成。

當(dāng)定義在上一個(gè)例子中的counter的值發(fā)生改變時(shí),下面例子的代碼片段能夠通知我們的app。

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) { ... }

    ...
}

這個(gè)activity是實(shí)現(xiàn)了 DataItem.DataListener 接口。該activity在onConnected()方法中增加自身成為數(shù)據(jù)元事件的監(jiān)聽(tīng)器,并在onPause()方法中移除監(jiān)聽(tīng)器。

我們也可以用一個(gè)service實(shí)現(xiàn)監(jiān)聽(tīng),請(qǐng)見(jiàn) 監(jiān)聽(tīng)數(shù)據(jù)層事件。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)