גדר מגדירה תנאי הקשר אחד או יותר שהאפליקציה יכולה להגיב לה. כשמצב של גדר משתנה, האפליקציה מקבלת קריאה חוזרת.
יש שני סוגים של גדרות: גדרות פרימיות שמייצגות סדרה בסיסית של אותות הקשר, וגדרות משולבות משולבות בגדרות בוליאניות. כל הגדרות הם מופעים של AwarenessFence
.
יצירת גדר מהדור הישן
גדרות פרימיות, שמייצגות את הקבוצה הבסיסית של אותות הקשר, מוגדרות בחבילה awareness.fence
. בדוגמה הבאה מוצגת יצירה של גדר פשוט: TRUE
כשפעילות המשתמש מזוהה היא WALKING
, אחרת FALSE
:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
בדוגמה הקודמת, השדה DetectedActivityFence
נוצר על ידי קריאה ל-during
, כלומר הגדר נמצא במצב TRUE
בכל פעם שהמשתמש נמצא ב-WALKING
.
תגובה להעברות
כל סוג של גדר מהדור הישן, מלבד TimeFence
, יכול להיות מופעל גם הוא מעט לאחר המעבר למצב הקשר. לדוגמה, אפשר להגדיר ש-DetectedActivityFence
יופעל מיד כאשר משתמש הוא starting
או פעילות של stopping
. גדרות המעבר נמצאות במצב 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
);
העצים המוצבים בתוך AND
, OR
ו-NOT
הם תקינים, כך ששילוב בוליאני של גדרות הוא אפשרי. בדוגמה הבאה מוצג גדר שמופעל על ידי משתמש שזז יותר מ-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));
השלב הבא: רישום גדר.