מצבי האנרגיה של SoC
מצבי החשמל של המערכת על שבב (SoC) הם: מופעל, במצב המתנה והשהיה. 'מופעל' הוא מצב שבו המעבד המובנה פועל. 'השבתה' הוא מצב של צריכת אנרגיה בינונית שבו המעבד המאוחד מופעל אבל לא מבצע משימות. 'השהיה' הוא מצב של צריכת אנרגיה נמוכה שבו המעבד המאוחד לא מופעל. צריכת האנרגיה של המכשיר במצב הזה היא בדרך כלל פי 100 פחות מאשר במצב 'מופעל'.
חיישנים שלא מעוררים את השעון
חיישנים ללא התעוררות הם חיישנים שלא מונעים מה-SoC לעבור למצב השהיה ולא מעוררים את ה-SoC כדי לדווח על נתונים. במיוחד, אסור למנהלי ההתקנים להחזיק ב-wake-locks. האפליקציות אחראיות לשמור על נעילה חלקית של מצב ההתעוררות אם הן רוצות לקבל אירועים מחישנים שאינם לצורך התעוררות בזמן שהמסך כבוי. בזמן שה-SoC נמצא במצב השהיה, החיישנים חייבים להמשיך לפעול וליצור אירועים, שמועברים ל-FIFO בחומרה. (פרטים נוספים זמינים במאמר אוסף בקשות). האירועים ב-FIFO מועברים לאפליקציות כש-SoC מתעורר. אם ה-FIFO קטן מדי כדי לאחסן את כל האירועים, האירועים הישנים יותר אבדו. הנתונים הישנים ביותר נמחקים כדי לפנות מקום לנתונים העדכניים ביותר. במקרה קיצוני שבו ה-FIFO לא קיים, כל האירועים שנוצרים בזמן שה-SoC נמצא במצב השהיה אבדו. חריג אחד הוא האירוע האחרון מכל חיישן שמופעל על שינוי: צריך לשמור את האירוע האחרון מחוץ ל-FIFO כדי שלא יאבד.
ברגע שה-SoC יוצא ממצב ההשהיה, כל האירועים מ-FIFO מדווחים והפעולות ממשיכות כרגיל.
אפליקציות שמשתמשות בחיישני התעוררות צריכות להחזיק בנעילה להפעלה כדי לוודא שהמערכת לא עוברת למצב השהיה, לבטל את הרישום מהחיישנים כשהן לא זקוקות להם או לצפות לאיבוד אירועים בזמן שה-SoC נמצא במצב השהיה.
חיישני התעוררות
בניגוד לחיישנים ללא התעוררות, חיישנים להתעוררות מבטיחים שהנתונים שלהם יישלחו ללא קשר למצב של המעבד המורכב (SoC). כשה-SoC פעיל, חיישני ההתעוררות מתנהגים כמו חיישנים ללא התעוררות. כש-SoC נמצא במצב שינה, חיישני ההתעוררות צריכים להעיר אותו כדי לשלוח אירועים. הם עדיין צריכים לאפשר ל-SoC לעבור למצב השהיה, אבל הם צריכים גם להעיר אותו כשצריך לדווח על אירוע. כלומר, החיישן צריך להעיר את ה-SoC ולשלוח את האירועים לפני שחלפה זמן האחזור המקסימלי לדיווח או שה-FIFO של החומרה מתמלא. פרטים נוספים זמינים במאמר אוסף בקשות.
כדי לוודא שלאפליקציות יהיה מספיק זמן לקבל את האירוע לפני שה-SoC יחזור למצב שינה, הנהג צריך להחזיק את 'נעילת ההתעוררות עם זמן קצוב' למשך 200 אלפיות השנייה בכל פעם שמדווחים על אירוע. כלומר, אסור לאפשר ל-SoC לחזור למצב שינה במהלך 200 אלפיות השנייה שלאחר הפסקה לצורך התעוררות. הדרישה הזו תיעלם בגרסה עתידית של Android, אבל עד אז אנחנו זקוקים לנעילת ההתעוררות עם זמן קצוב.
איך מגדירים חיישני התעוררות וחיישנים ללא התעוררות?
עד KitKat, סוג החיישן קבע אם הוא חיישן להפעלה או לא: רוב החיישנים לא היו חיישנים להפעלה, מלבד חיישן הקרבה וגלאי התנועה המשמעותית.
החל מ-L, המערכת מציינת באמצעות דגל בהגדרת החיישן אם הוא חיישן התעוררות או לא. אפשר להגדיר את רוב החיישנים באמצעות זוגות של וריאנטים של אותו חיישן – אחד לצורך התעוררות והשני ללא התעוררות. במקרה כזה, הם צריכים להתנהג כמו שני חיישנים עצמאיים, ללא אינטראקציה ביניהם. פרטים נוספים זמינים במאמר אינטראקציה.
אלא אם צוין אחרת בהגדרת סוג החיישן, מומלץ להטמיע חיישן אחד להפעלה וחישה וחיישן אחד ללא הפעלה וחישה לכל סוג חיישן שמופיע בסוגי חיישנים. בכל הגדרה של סוג חיישן, בודקים איזה חיישן (חיישן התעוררות או חיישן אחר) יוחזר על ידי SensorManager.getDefaultSensor(sensorType)
. זהו החיישן שבו רוב האפליקציות ישתמשו.