- Android入門基礎:從這裡開始
- Android分享操作
- Android多媒體
- Android圖像與動畫
- Android網絡連接與雲服務
- Android聯繫人與位置信息
- Android可穿戴應用
- Android TV應用
- Android企業級應用
- Android交互設計
- Android界面設計
- Android用戶輸入
- Android後臺任務
- Android性能優化
- Android安全與隱私
- Android測試程序
同步數據單元
編寫:wly2014 - 原文: http://developer.android.com/training/wearables/data-layer/data-items.html
DataItem是指系統用於同步手持設備與可穿戴設備間數據的接口。一個DataItem通常包括以下幾點:
Pyload - 一個字節數組,我們可以用來設置任何數據,讓我們的對象序列化和反序列化。Pyload的大小限制在100k之內。
Path - 唯一且以前斜線開頭的字符串(如:"/path/to/data")。
通常不直接實現DataItem,而是:
- 創建一個PutdataRequest對象,指明一個字符串路徑以唯一確定該 item。
- 調用setData()方法設置Pyload。
- 調用DataApi.putDataItem()方法,請求系統創建數據元。
- 當請求數據元的時候,系統會返回正確實現DataItem接口的對象。
然而,我們建議使用Data Map來顯示裝在一個易用的類似Bundle接口中的數據元,而不是用setData()來處理原始字節。
用 Data Map 同步數據
使用DataMap類,將數據元處理為 Android Bundle的形式,因此會完成對象的序列化和反序列化,我們就可以以鍵值對(key-value)的形式操縱數據。
如何使用data map:
- 創建一個 PutDataMapRequest對象,設置數據元的路徑。
Note: 數據元的路徑字符串是唯一確定的,這樣能夠使我們從連接任意一端訪問數據元。路徑須以前斜線開始。如果我們想在應用中使用分層數據,就要創建一個適合數據結構的路徑方案。
- 調用PutDataMapRequest.getDataMap()獲取一個我們可以使用的data map 對象。
- 使用put...()方法,如:putString(),為data map設置數據。
- 調用PutDataMapRequest.asPutDataRequest()獲得PutDataRequest對象。
- 調用 DataApi.putDataItem() 請求系統創建數據元。
Note: 如果手機和可穿戴設備沒有連接,數據會緩衝並在重新建立連接時同步。
接下的例子中的increaseCounter()
方法展示瞭如何創建一個data map,並設置數據:
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);
}
...
}
有關控制 PendingResult 對象的更多信息,請參見 Wait for the Status of Data Layer Calls 。
監聽數據元事件
如果數據層連接的一端數據發生改變,我們很可能想要被告知在連接的另一端發生的任何改變。我們可以通過實現一個數據元事件的監聽器來完成。
當定義在上一個例子中的counter的值發生改變時,下面例子的代碼片段能夠通知我們的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) { ... }
...
}
這個activity是實現了 DataItem.DataListener 接口。該activity在onConnected()
方法中增加自身成為數據元事件的監聽器,並在onPause()
方法中移除監聽器。
我們也可以用一個service實現監聽,請見 監聽數據層事件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论