创建围栏

边界用于定义应用可以响应的一个或多个上下文条件。当栅栏的状态发生变化时,您的应用会收到回调。

栅栏有两种类型:基元栅栏,表示一组基本上下文信号;组合栅栏,使用布尔运算符组合多个基元栅栏。所有围栏都是 AwarenessFence 的实例。

创建基元栅栏

基元屏障(表示一组基本情境信号)在 awareness.fence 软件包中定义。以下示例展示了如何创建一个简单的围栏,当用户的检测到的活动为 WALKING 时为 TRUE,否则为 FALSE

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

在前面的示例中,DetectedActivityFence 是通过调用 during 创建的,这意味着每当用户处于 WALKING 状态时,该栅栏便处于 TRUE 状态。

响应转场

除了 TimeFence 之外,每个基元栅栏类型也可以在上下文状态转换时暂时触发。例如,您可以设置 DetectedActivityFence,以便在用户startingstopping某个 activity 时暂时触发。转换栅栏会在 TRUE 状态下停留几秒钟,然后再次变为 FALSE

创建组合围栏

组合栅栏使用布尔运算符组合多个基元栅栏类型。以下示例展示了如何创建组合围栏,该围栏会在用户步行插入耳机时激活:

// 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 米,当前时间过去超过一小时时,系统就会触发该围栏。

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));

后续步骤:注册围栏