Nhận tin nhắn báo hiệu

Ứng dụng của bạn có thể đăng ký tệp đính kèm beacon Bluetooth năng lượng thấp (BLE) bằng cách sử dụng cùng một cơ chế dùng để đăng ký các thông báo do các thiết bị lân cận khác phát hành. Khi đăng ký, ứng dụng của bạn sẽ tự động nhận thông báo từ cả beacon và thiết bị ở gần.

Đăng ký nhận thông báo beacon BLE

Có 2 cách để ứng dụng của bạn có thể đăng ký nhận thông báo báo hiệu BLE:

  • nền trước, để phản hồi một hành động hoặc sự kiện của người dùng.
  • Trong nền, khi ứng dụng của bạn không chạy.

Đăng ký ở nền trước

Khi ứng dụng của bạn đăng ký thông báo báo hiệu ở nền trước, quá trình quét sẽ được thực hiện liên tục cho đến khi ứng dụng của bạn hủy đăng ký. Chỉ bắt đầu gói thuê bao trên nền trước khi ứng dụng đang hoạt động, thường là để phản hồi một hành động của người dùng.

Ứng dụng của bạn có thể kích hoạt gói thuê bao trên nền trước bằng cách gọi Nearby.getMessagesClient(Activity).subscribe(MessageListener, SubscribeOptions) và thiết lập tuỳ chọn Strategy thành BLE_ONLY.

Đoạn mã sau đây minh hoạ cách bắt đầu một gói thuê bao trên nền trước 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);
}

Khi không còn cần đăng ký, ứng dụng của bạn nên huỷ đăng ký bằng cách gọi Nearby.getMessagesClient(Activity).unsubscribe(MessageListener).

Đăng ký trong nền

Khi ứng dụng của bạn đăng ký nhận thông báo báo hiệu ở chế độ nền, quy trình quét tiết kiệm pin sẽ được kích hoạt tại các sự kiện trên màn hình, ngay cả khi ứng dụng hiện không hoạt động. Bạn có thể sử dụng các thông báo quét này để "đánh thức" ứng dụng của mình nhằm phản hồi một thông báo cụ thể. Các gói thuê bao trong nền tiêu thụ ít điện năng hơn so với các gói thuê bao trên nền trước, nhưng có độ trễ cao hơn và độ tin cậy thấp hơn.

Ứng dụng của bạn có thể kích hoạt gói thuê bao trong nền bằng cách gọi Nearby.getMessagesClient(Activity).subscribe(PendingIntent, SubscribeOptions) và thiết lập tuỳ chọn Strategy thành BLE_ONLY.

Đoạn mã sau đây minh hoạ việc bắt đầu một gói thuê bao trong nền bằng cách gọi 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);
}

Đoạn mã sau đây minh hoạ việc xử lý ý định trong lớp 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);
        }
    });
}

Khi không còn cần đăng ký, ứng dụng của bạn nên huỷ đăng ký bằng cách gọi Nearby.getMessagesClient(Activity).unsubscribe(PendingIntent).

Phân tích cú pháp thông báo báo hiệu

Tệp đính kèm báo hiệu là blob dữ liệu tùy ý mà bạn có thể thêm vào báo hiệu. Mỗi tệp đính kèm bao gồm các phần sau:

  • Không gian tên: Giá trị nhận dạng vùng chứa tên.
  • Loại: Loại dữ liệu.
  • Dữ liệu: Giá trị dữ liệu cho tệp đính kèm.

Đoạn mã sau đây minh hoạ việc sử dụng trình nghe thông báo để phân tích cú pháp các thông báo nhận được từ báo hiệu 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());
    }

    ...
};

Việc phân tích cú pháp nội dung tuỳ thuộc vào định dạng của byte. Ví dụ này giả định rằng các byte nội dung mã hoá chuỗi UTF-8, nhưng thông báo báo hiệu của bạn có thể mã hoá các định dạng byte khác (ví dụ: vùng đệm giao thức tuần tự). Để biết thêm thông tin, hãy xem phần Thêm tệp đính kèm vào Báo hiệu.

Để tìm hiểu không gian tên nào liên kết với dự án của bạn, hãy gọi namespaces.list.

Lưu ý: