גדר מגדירה תנאי אחד או יותר לפי הקשר שהאפליקציה יכולה להגיב אליהם. כשהמצב של גדר משתנה, האפליקציה מקבלת קריאה חוזרת (callback).
יש שני סוגים של גדרות: גדרות פרימיטיביות, שמייצגות את קבוצת האותות הבסיסית של ההקשר, וגדרות משולבות, שמשלבות כמה גדרות פרימיטיביות באמצעות אופרטורים בוליאניים. כל הגדרות הן מופעים של 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));
השלב הבא: רישום גדר.