创建围栏

围栏定义了一个或多个上下文条件,应用可以对这些条件做出反应。 当围栏的状态发生变化时,您的应用会收到回调。

围栏有两种类型:基本围栏(表示基本的一组情境信号)和组合围栏(使用布尔运算符组合多个基本围栏)。所有围栏都是 AwarenessFence 的实例。

创建原始围栏

表示基本情境信号集的原始围栏在 awareness.fence 软件包中定义。以下示例展示了如何创建一个简单的围栏,当检测到的用户活动为 WALKING 时,该围栏的状态为 TRUE;否则为 FALSE

AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);

在上述示例中,DetectedActivityFence 是通过调用 during 创建的,这意味着只要用户处于 WALKING 状态,围栏就会处于 TRUE 状态。

对过渡做出反应

每种基本围栏类型(TimeFence 除外)还可以在上下文状态转换时短暂触发。例如,您可以设置一个 DetectedActivityFence,以便在用户处于 startingstopping 活动状态时短暂触发。过渡围栏在变为 FALSE 状态之前会处于 TRUE 状态几秒钟。

创建组合围栏

组合围栏使用布尔运算符组合多种原始围栏类型。以下示例展示了如何创建在用户行走耳机已插入时激活的组合围栏:

// Create the primitive fences.
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
AwarenessFence headphoneFence = HeadphoneFence.during(HeadphoneState.PLUGGED_IN);

// Create a combination fence to AND primitive fences.
AwarenessFence walkingWithHeadphones = AwarenessFence.and(
      walkingFence, headphoneFence
);

ANDORNOT 的嵌套树是有效的,因此可以实现围栏的任意布尔组合。以下示例展示了一个围栏,当用户移动到距离当前位置 100 米以外的位置自当前时间起经过 1 小时以上时,该围栏会触发。

double currentLocationLat;  // current location latitude
double currentLocationLng;  // current location longitude
long nowMillis = System.currentTimeMillis();
long oneHourMillis = 1L * 60L * 60L * 1000L;

AwarenessFence orExample = AwarenessFence.or(
        AwarenessFence.not(LocationFence.in(
                currentLocationLat,
                currentLocationLng,
                100.0,
                100.0,
                0L)),
        TimeFence.inInterval(nowMillis + oneHourMillis, Long.MAX_VALUE));

下一步:注册围栏