您的应用可以订阅蓝牙低功耗 (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
类中的 intent。
@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。
备注:
-
如需延长电池续航时间,请调用
Nearby.getMessagesClient(Activity).unsubscribe()
(位于 activity 的onStop()
函数中)。请注意,这仅适用于 在前台进行订阅。 -
为了缩短延迟时间,请在调用
Nearby.getMessagesClient(Activity).subscribe()
时使用Strategy.BLE_ONLY
选项。 设置此选项后,Nearby Messages API 将不会触发传统版蓝牙 扫描。这可以缩短信标检测的延迟时间,因为系统 不会循环遍历所有可能的扫描类型。 - 要将消息有效负载附加到信标,请使用 Proximity Beacon API。