Trong API Nhận biết, khái niệm hàng rào được lấy từ khoanh vùng địa lý, trong đó một khu vực địa lý hoặc khoanh vùng địa lý được định nghĩa và một ứng dụng sẽ nhận được lệnh gọi lại khi người dùng nhập hoặc rời khỏi khoanh vùng địa lý. Fence API mở rộng khái niệm khoanh vùng địa lý để bao gồm nhiều điều kiện ngữ cảnh khác ngoài vùng lân cận theo địa lý. Ứng dụng sẽ nhận được lệnh gọi lại mỗi khi trạng thái ngữ cảnh chuyển đổi. Ví dụ: nếu ứng dụng của bạn xác định hàng rào cho tai nghe, thì ứng dụng sẽ nhận được lệnh gọi lại khi đang cắm tai nghe và khi không cắm.
Bạn có thể sử dụng API Hàng rào để xác định hàng rào dựa trên tín hiệu ngữ cảnh, chẳng hạn như sau:
- 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, như đi bộ hoặc lái xe.
- Các điều kiện của thiết bị cụ thể, chẳng hạn như bạn đã cắm tai nghe hay chưa.
- Mức độ gần với beacon lân cận
Fence API cho phép bạn kết hợp nhiều tín hiệu ngữ cảnh để tạo hàng rào với toán tử boolean AND
, OR
và NOT
. Sau đó, ứng dụng sẽ nhận được lệnh gọi lại mỗi khi đáp ứng các điều kiện của hàng rào. Sau đây là một số ví dụ về 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 nhập khoanh vùng địa lý 100 mét trước 5 giờ chiều của một ngày trong tuần.
- Người dùng nhập phạm vi của một beacon BLE cụ thể.
Ví dụ sau đây cho thấy cách xác định hàng rào sẽ 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 hàng rào, bạn phải làm như sau:
- Hãy gọi
updateFences
để đăng ký hàng rào để nhận lệnh gọi lại. - Xác định lệnh gọi lạ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ý 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);
}
}
}