حصار یک یا چند شرط بافت را تعریف میکند که برنامه شما میتواند به آنها واکنش نشان دهد. وقتی وضعیت حصار تغییر میکند، برنامهتان فراخوانی برگشتی دریافت میکند.
دو نوع حصار وجود دارد: حصارهای اولیه که مجموعه اصلی سیگنالهای بافت را نشان میدهند، و حصارهای ترکیبی که چندین حصار اولیه را بااستفاده از عملگرهای بولی ترکیب میکنند. همه حصارها نمونههایی از AwarenessFence هستند.
ایجاد حصار قدیمی
حصارکشیهای اولیه که مجموعه اصلی نشانهای بافت را نشان میدهند، در بسته awareness.fence تعریف شدهاند. مثال زیر ایجاد حصار سادهای را نشان میدهد که وقتی فعالیت شناساییشده کاربر WALKING باشد، TRUE است و درغیراینصورت FALSE است:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
در مثال قبلی، DetectedActivityFence
با تماس با during ایجاد شده است،
یعنی هرگاه کاربر WALKING باشد، حصار در وضعیت TRUE قرار دارد.
واکنش به انتقالها
هر نوع حصار اولیه، بهاستثنای 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 معتبر هستند، بنابراین هر ترکیب بولی از حصارها امکانپذیر است. مثال زیر حصاری را نشان میدهد که
وقتی کاربر بیشاز ۱۰۰ متر از مکان فعلی جابهجا میشود،
یا بیشاز یک ساعت از زمان فعلی میگذرد، راهاندازی میشود.
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));
مرحله بعدی: ثبت حصار.