您的應用程式可訂閱藍牙低功耗 (BLE) 信標附件 使用的機制與訂閱 和其他鄰近裝置。訂閱時,您的應用程式會自動接收 都有來自信標和附近裝置的訊息。
訂閱 BLE 信標訊息
應用程式可以透過兩種方式訂閱 BLE 信標訊息:
- 在前景中,回應使用者動作 或事件
- 在「背景」中,當應用程式於 而不是執行中
在前景訂閱
如果您的應用程式在前景訂閱信標訊息,掃描作業會 持續互動,直到應用程式取消訂閱為止。只啟動前景 訂閱項目 (通常是為了回應使用者動作)。
應用程式可透過呼叫的方式啟動前景訂閱
Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
敬上
並將 Strategy
選項設為 BLE_ONLY
。
下列程式碼片段展示啟動前景訂閱
Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions)
:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mMessageListener = new MessageListener() {
@Override
public void onFound(Message message) {
Log.d(TAG, "Found message: " + new String(message.getContent()));
}
@Override
public void onLost(Message message) {
Log.d(TAG, "Lost sight of message: " + new String(message.getContent()));
}
}
}
// Subscribe to receive messages.
private void subscribe() {
Log.i(TAG, "Subscribing.");
SubscribeOptions options = new SubscribeOptions.Builder()
.setStrategy(Strategy.BLE_ONLY)
.build();
Nearby.getMessagesClient(this).subscribe(mMessageListener, options);
}
不再需要訂閱時,應用程式應取消訂閱
撥號
Nearby.getMessagesClient(Activity).unsubscribe(MessageListener)
。
在背景中訂閱
應用程式在背景訂閱信標訊息時,低功耗掃描 就算應用程式目前並非使用中狀態,也會觸發這個事件。 你可以使用這些掃描通知「起床」能回應 特定訊息。背景訂閱耗電量少於 但延遲時間較長且穩定性較低
您的應用程式可以透過呼叫
Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
敬上
並將 Strategy
選項設為 BLE_ONLY
。
下列程式碼片段示範如何透過
撥號中
Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions)
。
// Subscribe to messages in the background.
private void backgroundSubscribe() {
Log.i(TAG, "Subscribing for background updates.");
SubscribeOptions options = new SubscribeOptions.Builder()
.setStrategy(Strategy.BLE_ONLY)
.build();
Nearby.getMessagesClient(this).subscribe(getPendingIntent(), options);
}
private PendingIntent getPendingIntent() {
return PendingIntent.getBroadcast(this, 0, new Intent(this, BeaconMessageReceiver.class),
PendingIntent.FLAG_UPDATE_CURRENT);
}
下列程式碼片段示範如何處理
BeaconMessageReceiver
類別。
@Override
public void onReceive(Context context, Intent intent) {
Nearby.getMessagesClient(context).handleIntent(intent, new MessageListener() {
@Override
public void onFound(Message message) {
Log.i(TAG, "Found message via PendingIntent: " + message);
}
@Override
public void onLost(Message message) {
Log.i(TAG, "Lost message via PendingIntent: " + message);
}
});
}
不再需要訂閱時,應用程式應取消訂閱
撥號
Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent)
。
剖析信標訊息
信標附件 是任意資料的 blob,可以新增至信標。 每個附件都包含以下部分:
- 命名空間:命名空間 ID。
- 類型:資料類型。
- 資料:附件的資料值。
下列程式碼片段示範如何使用訊息事件監聽器剖析 從 BLE 信標收到的訊息:
mMessageListener = new MessageListener() {
@Override
public void onFound(Message message) {
// Do something with the message here.
Log.i(TAG, "Message found: " + message);
Log.i(TAG, "Message string: " + new String(message.getContent()));
Log.i(TAG, "Message namespaced type: " + message.getNamespace() +
"/" + message.getType());
}
...
};
剖析內容視位元組的格式而定。這個範例假設 內容位元組會將 UTF-8 字串編碼,但您的信標訊息可以 編碼其他位元組格式 (例如序列化的通訊協定緩衝區)。 詳情請參閱「新增信標的附件」。
如要瞭解與專案相關聯的命名空間,請呼叫 namespaces.list。
附註:
-
為了延長電池續航力,請撥打
Nearby.getMessagesClient(Activity).unsubscribe()
在活動的onStop()
函式中。請注意,這僅適用於 前景訂閱 -
如要縮短延遲時間,請在呼叫
Nearby.getMessagesClient(Activity).subscribe()
時使用Strategy.BLE_ONLY
選項。 設定這個選項後,Nearby Messages API 不會觸發傳統藍牙 以及掃描作業這能改善信標偵測的延遲時間,因為系統 無法循環切換所有可能的掃描類型 - 如要將訊息酬載附加至信標,請使用 Proximity Beacon API。