<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                > 編寫:[wly2014](https://github.com/wly2014) - 原文: [http://developer.android.com/training/wearables/data-layer/events.html](http://developer.android.com/training/wearables/data-layer/events.html) 當做出數據層上的調用時,你可以得到它完成后的調用狀態,也可以用監聽器監聽到調用最終實現的改變。 ### 等待數據層調用狀態 注意到,調用數據層API,有時會返回[PendingResult](#),如 [putDataItem()](#))。PendingResult一被創建,操作就會在后臺排列等候。之后你若無動作,這些操作最終會默默完成。然而,通常要處理操作完成后的結果,PendingResult能夠讓你同步或異步地等待結果。 ### 異步等待 若你的代碼運行在主UI線程上,不使阻塞調用數據層API。你可以增加一個PendingResult對象回調來運行異步調用,將在操作完成時觸發。 ~~~ pendingResult.setResultCallback(new ResultCallback<DataItemResult>() { @Override public void onResult(final DataItemResult result) { if(result.getStatus().isSuccess()) { Log.d(TAG, "Data item set: " + result.getDataItem().getUri()); } } }); ~~~ ### 同步等待 如果你的代碼是運行在后臺服務的一個單獨的處理線程上([WearableListenerService](#)的情況),則適合調用阻塞。在這種情況下,你可以用PendingResult對象調用[await()](#)),它將阻塞至請求完成,并返回一個Result對象。 ~~~ DataItemResult result = pendingResult.await(); if(result.getStatus().isSuccess()) { Log.d(TAG, "Data item set: " + result.getDataItem().getUri()); } ~~~ # 監聽數據層事件 因為數據層在手持和可穿戴設備間同步并發送數據,所以通常要監聽重要事件,例如創建數據元,接受消息,或當可穿戴設備和手機連接時。 對于監聽數據層事件,有兩種選擇: - 創建一個繼承自WearableListenerService的service。 - 創建一個實現[DataApi.DataListener](#)接口的[activity](# "An activity represents a single screen with a user interface.")。 通過這兩種選擇,你覆寫任何你關心的數據事件回調方法來處理您的實現。 ### 使用 WearableListenerService 典型地,在你的手持設備和可穿戴設備上都創建該service實例。如果你不關心其中一個應用中的數據事件,就不需要在相應的應用中實現此service。 例如,您可以在一個手持設備應用程序上操作數據元對象,可穿戴設備的應用監聽這些更新并更新UI。而可穿戴不更新任何數據元,所以手持設備的應用不監聽任何可穿戴式設備應用的數據事件。 你可以用 WearableListenerService監聽如下事件: - [onDataChanged()](#)) - 當數據元對象創建,更改,刪除時調用。一連接端的事件將觸發兩端的回調方法。 - [onMessageReceived()](#)) - 消息從一連接端發出時在另一連接端觸發此回調方法。 - [onPeerConnected()](#)) 和 [onPeerDisconnected()](#)) - 當與手持或可穿戴設備連接或斷開時調用。一連接端連接狀態的改變會在兩端觸發此回調方法。 創建WearableListenerService: 1. 創建一個繼承自WearableListenerService的類。 1. 監聽你關心的事件,比如onDataChanged()。 1. 在Android manifest中聲明一個intent filter,通知系統你的WearableListenerService。這樣允許系統需要時綁定你的service。 下例展示如何實現一個簡單的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); } } } ~~~ 這是Android mainfest中相應的intent filter: ~~~ <service android:name=".DataLayerListenerService"> <intent-filter> <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service> ~~~ ### 數據層回調權限 為了在數據層事件上向你的程序提供回調方法,Google Play services 綁定到你的WearableListenerService,通過IPC調用回調方法。這樣的結果是,你的回調方法繼承了調用進程的權限。 如果你想在一個回調中執行權限操作,安全檢查會失敗,因為你的回調是以調用進程的身份運行,而不是應用程序進程的身份運行。 為了解決這個問題,在進入IPC后使用[clearCallingIdentity()](#))重置身份,當你完成權限操作后,使用[restoreCallingIdentity()](#))恢復身份: ~~~ long token = Binder.clearCallingIdentity(); try { performOperationRequiringPermissions(); } finally { Binder.restoreCallingIdentity(token); } ~~~ ### 使用監聽者 [Activity](# "An activity represents a single screen with a user interface.") 如果你的應用只關心當用戶與應用交互時產生的數據層事件,并且不需要一個長時間運行的service來處理每一次數據的改變,那么你可以在一個[activity](# "An activity represents a single screen with a user interface.")中通過實現如下一個和多個接口監聽事件: - [DataApi.DataListener](http://developer.android.com/reference/com/google/android/gms/wearable/DataApi.DataListener.html) - [MessageApi.MessageListener](http://developer.android.com/reference/com/google/android/gms/wearable/MessageApi.MessageListener.html) - [NodeApi.NodeListener](http://developer.android.com/reference/com/google/android/gms/wearable/NodeApi.NodeListener.html) 如何創建一個[activity](# "An activity represents a single screen with a user interface.")監聽數據事件: - 實現所需的接口。 - 在onCreate(Bundle)中創建 GoogleApiClient實例。 - 在onStart()中調用connect() 將客戶端連接到 Google Play services。 - 當連接到Google Play services后,系統調用 onConnected()。這里你調用[DataApi.addListener()](http://developer.android.com/reference/com/google/android/gms/wearable/DataApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.DataApi.DataListener)), [MessageApi.addListener()](http://developer.android.com/reference/com/google/android/gms/wearable/MessageApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.MessageApi.MessageListener)), 或 [NodeApi.addListener()](http://developer.android.com/reference/com/google/android/gms/wearable/NodeApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.NodeApi.NodeListener))以告知Google Play services,你的[activity](# "An activity represents a single screen with a user interface.")要監聽數據層事件。 - 在 onStop()中,用 [DataApi.removeListener()](http://developer.android.com/reference/com/google/android/gms/wearable/DataApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.DataApi.DataListener)), [MessageApi.removeListener()](http://developer.android.com/reference/com/google/android/gms/wearable/MessageApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.MessageApi.MessageListener))或[NodeApi.removeListener()](http://developer.android.com/reference/com/google/android/gms/wearable/NodeApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.NodeApi.NodeListener)) 注銷監聽。 - 基于你實現的接口繼而實現 onDataChanged(), onMessageReceived(), onPeerConnected()和 onPeerDisconnected()。 這是實現DataApi.DataListener的例子 : ~~~ public class MainActivity extends Activity implements DataApi.DataListener, ConnectionCallbacks, OnConnectionFailedListener { private GoogleApiClient mGoogleApiClient; @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()); } } } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看