SoC-Energiezustände
Die Betriebsmodi des System-on-Chips (SoC) sind „An“, „Inaktivität“ und „Suspend“. „An“ bedeutet, dass das SoC läuft. „Inaktiv“ ist ein Modus mit mittlerer Leistungsaufnahme, bei dem das SoC eingeschaltet ist, aber keine Aufgaben ausführt. „Suspend“ ist ein Energiesparmodus, bei dem das SoC nicht mit Strom versorgt wird. Der Stromverbrauch des Geräts in diesem Modus ist in der Regel 100-mal geringer als im Modus „An“.
Sensoren, die nicht zum Aktivieren des Displays verwendet werden
Nicht-Wecksensoren sind Sensoren, die den SoC nicht daran hindern, in den Ruhemodus zu wechseln, und ihn auch nicht zum Melden von Daten aufwecken. Insbesondere dürfen die Treiber keine Wakelocks halten. Es liegt in der Verantwortung der Anwendungen, einen teilweisen Wakelock aufrechtzuerhalten, wenn sie Ereignisse von Sensoren erhalten möchten, die nicht zum Aktivieren des Displays dienen, während das Display ausgeschaltet ist. Wenn sich das SoC im Ruhemodus befindet, müssen die Sensoren weiterhin funktionieren und Ereignisse generieren, die in einen Hardware-FIFO eingefügt werden. Weitere Informationen finden Sie unter Batching. Die Ereignisse im FIFO werden an die Anwendungen gesendet, wenn das SoC aktiviert wird. Wenn der FIFO zu klein ist, um alle Ereignisse zu speichern, gehen die älteren Ereignisse verloren. Die ältesten Daten werden verworfen, um Platz für die neuesten Daten zu schaffen. Im Extremfall, dass der FIFO nicht vorhanden ist, gehen alle Ereignisse verloren, die generiert wurden, während sich der SoC im Ruhemodus befand. Eine Ausnahme ist das letzte Ereignis von jedem Sensor mit Änderungserkennung: Das letzte Ereignis muss außerhalb des FIFO gespeichert werden , damit es nicht verloren geht.
Sobald der SoC den Ruhemodus verlässt, werden alle Ereignisse aus dem FIFO gemeldet und der Betrieb wird wie gewohnt fortgesetzt.
Bei Anwendungen, die keine Wecksensoren verwenden, sollte entweder eine Wake-Lock gehalten werden, um zu verhindern, dass das System in den Ruhemodus wechselt, die Sensoren nicht registriert werden, wenn sie nicht benötigt werden, oder es muss damit gerechnet werden, dass Ereignisse verloren gehen, während sich das SoC im Ruhemodus befindet.
Wecksensoren
Im Gegensatz zu Nicht-Wecksensoren sorgen Wecksensoren dafür, dass ihre Daten unabhängig vom Status des SoCs gesendet werden. Wenn der SoC aktiv ist, verhalten sich die Wecksensoren wie Nicht-Wecksensoren. Wenn das SoC inaktiv ist, müssen Wecksensoren es aufwecken, um Ereignisse zu senden. Sie müssen den SoC zwar in den Ruhemodus versetzen lassen, ihn aber auch wieder aufwecken, wenn ein Ereignis gemeldet werden muss. Das bedeutet, dass der Sensor das SoC aufwecken und die Ereignisse senden muss, bevor die maximale Berichtslatenz abgelaufen ist oder der Hardware-FIFO voll ist. Weitere Informationen finden Sie unter Batch-Verarbeitung.
Damit die Anwendungen genügend Zeit haben, das Ereignis zu empfangen, bevor das SoC wieder in den Ruhemodus wechselt, muss der Treiber jedes Mal, wenn ein Ereignis gemeldet wird, 200 Millisekunden lang eine „Timeout-Aufwachsperre“ halten. Das heißt, der SoC darf in den 200 Millisekunden nach einem Weckunterbrechung nicht wieder in den Ruhemodus wechseln. Diese Anforderung wird in einer zukünftigen Android-Version nicht mehr erforderlich sein. Bis dahin ist diese Zeitüberschreitung für die Wakelock erforderlich.
Wie definiere ich Sensoren, die das Gerät aktivieren, und Sensoren, die das Gerät nicht aktivieren?
Bis KitKat wurde festgelegt, ob ein Sensor ein Weck- oder ein Nicht-Weck-Sensor war, durch den Sensortyp: Die meisten waren Nicht-Weck-Sensoren, mit Ausnahme des Näherungssensors und des Bewegungsmelders für wichtige Bewegungen.
Ab L wird angegeben, ob ein bestimmter Sensor ein Wecksensor ist oder nicht. Die meisten Sensoren können durch Paare von Varianten desselben Sensors mit und ohne Weckfunktion definiert werden. In diesem Fall müssen sie sich wie zwei unabhängige Sensoren verhalten und dürfen nicht miteinander interagieren. Weitere Informationen finden Sie unter Interaktion.
Sofern in der Definition des Sensortyps nicht anders angegeben, wird empfohlen, für jeden in Sensortypen aufgeführten Sensortyp einen Wecksensor und einen Nicht-Wecksensor zu implementieren. Sehen Sie in jeder Sensortypdefinition nach, welcher Sensor (mit oder ohne Weckfunktion) von SensorManager.getDefaultSensor(sensorType)
zurückgegeben wird. Dieser Sensor wird von den meisten Anwendungen verwendet.