您的應用程式可使用與訂閱鄰近裝置發布訊息相同的機制,訂閱藍牙低功耗 (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。每個附件由下列部分組成:
- 命名空間:命名空間識別碼。
- 類型:資料類型。
- 資料:附件的資料值。
下列程式碼片段示範如何使用訊息監聽器剖析從 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。
附註:
-
為了節省電池續航力,請在活動的
onStop()
函式中呼叫Nearby.getMessagesClient(Activity).unsubscribe()
。請注意,這僅適用於在前景中訂閱的情況。 -
如要縮短延遲時間,請在呼叫
Nearby.getMessagesClient(Activity).subscribe()
時使用Strategy.BLE_ONLY
選項。設定這個選項後,Nearby Messages API 就不會觸發傳統版藍牙掃描。這樣可以縮短信標偵測的延遲時間,因為系統不會逐一檢查所有可能的掃描類型。 - 如要將訊息酬載附加至信標,請使用 Proximity Beacon API。