גדר מגדירה תנאי הקשר אחד או יותר שהאפליקציה יכולה להגיב אליהם. כשהמצב של הגדר משתנה, האפליקציה מקבלת קריאה חוזרת (callback).
יש שני סוגים של גדרות: גדרות פרימיטיביות, שמייצגות את קבוצת הבסיס של אותות הקשר, וגדרות משולבות, שמשלבות כמה גדרות פרימיטיביות באמצעות אופרטורים בוליאניים. כל הגדרות הגיאוגרפיות הן מקרים של AwarenessFence
.
יצירת גדר פרימיטיבית
גדרות פרימיטיביות, שמייצגות את קבוצת אותות ההקשר הבסיסית, מוגדרות בחבילה awareness.fence
. בדוגמה הבאה מוצג יצירה של גדר פשוטה שמוגדרת כ-TRUE
when the user's detected activity is WALKING
,
and FALSE
otherwise:
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));
השלב הבא: רישום גדר וירטואלית.