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