حالت های قدرت SoC
حالت های قدرت سیستم روی یک تراشه (SoC) عبارتند از: روشن، بیکار و معلق. «روشن» زمانی است که SoC در حال اجرا است. "Idle" یک حالت با قدرت متوسط است که در آن SoC تغذیه می شود اما هیچ وظیفه ای را انجام نمی دهد. "Suspend" یک حالت کم مصرف است که در آن SoC روشن نمی شود. مصرف برق دستگاه در این حالت معمولاً 100 برابر کمتر از حالت «روشن» است.
سنسورهای غیر بیدار
سنسورهای غیر بیدار سنسورهایی هستند که از رفتن SoC به حالت تعلیق جلوگیری نمی کنند و SoC را برای گزارش داده ها بیدار نمی کنند. به ویژه، رانندگان مجاز به نگه داشتن ویک-لاک نیستند. اگر برنامهها میخواهند رویدادها را در حالی که صفحه خاموش است، از حسگرهای غیر بیدار دریافت کنند، وظیفه نگه داشتن قفل بیدار شدن جزئی را بر عهده دارند. در حالی که SoC در حالت تعلیق است، حسگرها باید به کار خود ادامه دهند و رویدادهایی را تولید کنند که در یک FIFO سخت افزاری قرار می گیرند. (برای جزئیات بیشتر به Batching مراجعه کنید.) رویدادهای موجود در FIFO زمانی که SoC بیدار می شود به برنامه ها تحویل داده می شود. اگر FIFO برای ذخیره همه رویدادها خیلی کوچک باشد، رویدادهای قدیمیتر از بین میروند. قدیمیترین دادهها حذف میشوند تا آخرین دادهها را در خود جای دهند. در حالت شدید که FIFO وجود ندارد، تمام رویدادهای ایجاد شده در حالی که SoC در حالت تعلیق است از بین می روند. یک استثنا آخرین رویداد از هر حسگر در حال تغییر است: آخرین رویداد باید خارج از FIFO ذخیره شود تا از بین نرود.
به محض اینکه SoC از حالت تعلیق خارج شد، همه رویدادها از FIFO گزارش می شوند و عملیات به حالت عادی از سر گرفته می شود.
برنامههایی که از حسگرهای غیر بیدار استفاده میکنند باید یک wake lock داشته باشند تا مطمئن شوند که سیستم به حالت تعلیق نمیرود، زمانی که حسگرها به آنها نیازی ندارند ثبت نام خود را لغو کنند، یا انتظار داشته باشند که رویدادها را زمانی که SoC در حالت تعلیق است از دست بدهند.
سنسورهای بیداری
در تقابل با حسگرهای غیر بیدار، حسگرهای بیدار اطمینان می دهند که داده های آنها مستقل از وضعیت SoC تحویل داده می شود. در حالی که SoC بیدار است، حسگرهای بیداری مانند حسگرهای غیر بیدار رفتار می کنند. هنگامی که SoC خواب است، حسگرهای بیداری باید SoC را برای ارائه رویدادها بیدار کنند. آنها همچنان باید به SoC اجازه دهند تا به حالت تعلیق برود، اما همچنین باید زمانی که رویدادی باید گزارش شود، آن را بیدار کنند. یعنی سنسور باید SoC را بیدار کند و رویدادها را قبل از سپری شدن حداکثر تاخیر گزارش یا پر شدن FIFO سخت افزاری ارائه دهد. برای جزئیات بیشتر به Batching مراجعه کنید.
برای اطمینان از اینکه برنامهها قبل از اینکه SoC به خواب برود، زمان دریافت رویداد را دارند، راننده باید هر بار که رویدادی گزارش میشود، یک «وقفه بیدار شدن در زمان بازدارنده» را به مدت 200 میلیثانیه نگه دارد. یعنی SoC نباید در 200 میلی ثانیه پس از وقفه بیدار شدن دوباره به خواب برود. این نیاز در نسخههای اندرویدی آینده ناپدید میشود و تا آن زمان به این زمانبندی wake lock نیاز داریم.
چگونه سنسورهای بیدار و غیر بیدار را تعریف کنیم؟
تا کیت کت، سنسور بیدار یا غیر بیدار با نوع سنسور تعیین می شد: بیشتر آنها حسگرهای غیر بیدار بودند، به استثنای سنسور مجاورت و آشکارساز حرکت قابل توجه .
با شروع از L، اینکه آیا یک حسگر معین یک حسگر بیداری است یا نه، با یک پرچم در تعریف سنسور مشخص می شود. اکثر سنسورها را می توان با جفت انواع بیدار و غیر بیدار از یک حسگر تعریف کرد، در این صورت آنها باید به عنوان دو حسگر مستقل رفتار کنند و با یکدیگر تعامل نداشته باشند. برای جزئیات بیشتر به تعامل مراجعه کنید.
به جز مواردی که در تعریف نوع سنسور طور دیگری مشخص شده باشد، توصیه می شود برای هر نوع حسگر فهرست شده در انواع سنسور، یک حسگر بیدار و یک حسگر غیر بیدار اجرا شود. در تعریف هر نوع حسگر، ببینید چه حسگری (بیدار یا غیر بیدار) توسط SensorManager.getDefaultSensor(sensorType)
برگردانده می شود. این سنسوری است که اکثر برنامه ها از آن استفاده خواهند کرد.