Trong API Awareness, khái niệm về hàng rào được lấy từ tính năng khoanh vùng địa lý, trong đó, một khu vực địa lý, hay vùng địa lý, được xác định và một ứng dụng sẽ nhận được lệnh gọi lại khi người dùng vào hoặc rời khỏi khu vực địa lý. Fence API mở rộng khái niệm về tính năng khoanh vùng địa lý để bao gồm nhiều điều kiện dựa trên bối cảnh khác ngoài khoảng cách gần về mặt địa lý. Ứng dụng sẽ nhận được lệnh gọi lại bất cứ khi nào trạng thái bối cảnh chuyển đổi. Ví dụ: nếu ứng dụng của bạn xác định một hàng rào cho tai nghe, thì ứng dụng sẽ nhận được lệnh gọi lại khi tai nghe được cắm và khi tai nghe bị rút ra.
Bạn có thể sử dụng Fence API để xác định hàng rào dựa trên các tín hiệu bối cảnh, chẳng hạn như:
- Vị trí hiện tại của người dùng (vĩ độ/kinh độ)
- Hoạt động hiện tại của người dùng, chẳng hạn như đi bộ hoặc lái xe.
- Các điều kiện dành riêng cho thiết bị, chẳng hạn như tai nghe có được cắm hay không.
- Khoảng cách gần với các đèn hiệu lân cận
Fence API cho phép bạn kết hợp nhiều
tín hiệu bối cảnh
để tạo hàng rào bằng các toán tử boolean AND, OR, và NOT. Sau đó, ứng dụng của bạn sẽ nhận được lệnh gọi lại bất cứ khi nào các điều kiện về hàng rào được đáp ứng. Sau đây là một số ví dụ về các hàng rào có thể có:
- Người dùng cắm tai nghe và bắt đầu đi bộ.
- Người dùng vào một vùng địa lý có bán kính 100 mét trước 5 giờ chiều vào một ngày trong tuần.
- Người dùng vào phạm vi của một đèn hiệu BLE cụ thể.
Ví dụ sau đây cho thấy cách xác định một hàng rào kích hoạt bất cứ khi nào người dùng đi bộ:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
Sau khi xác định một hàng rào, bạn phải làm như sau:
- Gọi
updateFencesđể đăng ký hàng rào nhằm nhận lệnh gọi lại. - Xác định một lệnh gọi lại có thể được gọi khi trạng thái hàng rào thay đổi.
Ví dụ sau đây cho thấy một phương thức tạo và đăng ký một hàng rào. Trong ví dụ này, một lớp con tuỳ chỉnh của BroadcastReceiver được dùng để xử lý ý định khi hàng rào được kích hoạt.
Awareness.getFenceClient(this).updateFences(new FenceUpdateRequest.Builder()
.addFence(FENCE_KEY, exercisingWithHeadphonesFence, mPendingIntent)
.build())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.i(TAG, "Fence was successfully registered.");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "Fence could not be registered: " + e);
}
});
public class FenceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
FenceState fenceState = FenceState.extract(intent);
if (TextUtils.equals(fenceState.getFenceKey(), FENCE_KEY)) {
String fenceStateStr;
switch (fenceState.getCurrentState()) {
case FenceState.TRUE:
fenceStateStr = "true";
break;
case FenceState.FALSE:
fenceStateStr = "false";
break;
case FenceState.UNKNOWN:
fenceStateStr = "unknown";
break;
default:
fenceStateStr = "unknown value";
}
mLogFragment.getLogView().println("Fence state: " + fenceStateStr);
}
}
}