Stany zasilania układu SoC
Stany zasilania układu SOC to: włączony, bezczynny i uśpiony. „Włączony” oznacza, że SoC jest włączony. „Nieaktywny” to tryb średniej mocy, w którym SoC jest zasilany, ale nie wykonuje żadnych zadań. „Wstrzymanie” to tryb oszczędzania energii, w którym SoC nie jest zasilany. W tym trybie zużycie energii przez urządzenie jest zwykle 100 razy mniejsze niż w trybie „Wł.”.
Czujniki niewybudzające
Czujniki niewybudzające to czujniki, które nie uniemożliwiają SoC przechodzenia w tryb zawieszenia i nie wybudzają SoC w celu raportowania danych. W szczególności sterowniki nie mogą blokować funkcji Wake-Lock. Aplikacje muszą utrzymywać częściową blokadę aktywacji, jeśli chcą otrzymywać zdarzenia z czujników niewybudzających, gdy ekran jest wyłączony. Gdy układ SoC jest w trybie zawieszenia, czujniki muszą nadal działać i generować zdarzenia, które są umieszczane w FIFO sprzętowym. (więcej informacji znajdziesz w sekcji Przetwarzanie zbiorcze). Zdarzenia w FIFO są dostarczane do aplikacji, gdy SoC się budzi. Jeśli kolejka FIFO jest za mała, aby pomieścić wszystkie zdarzenia, starsze zdarzenia zostaną utracone. Najstarsze dane zostaną usunięte, aby pomieścić najnowsze dane. W skrajnym przypadku, gdy kolejka FIFO nie istnieje, wszystkie zdarzenia wygenerowane, gdy SoC jest w stanie zawieszenia, zostaną utracone. Wyjątkiem jest najnowsze zdarzenie z każdego czujnika zmiany: ostatnie zdarzenie musi zostać zapisane poza kolejką FIFO, aby nie mogło zostać utracone.
Gdy tylko SoC wyjdzie z trybu zawieszenia, wszystkie zdarzenia z FIFO zostaną zgłoszone, a działania wznowione w normalny sposób.
Aplikacje korzystające z czujników niewybudzających powinny albo zablokować możliwość wybudzania, aby system nie przechodził w tryb zawieszenia, albo odrejestrować czujniki, gdy ich nie potrzebują, albo liczyć się z utratą zdarzeń, gdy SoC jest w stanie zawieszenia.
Czujniki wybudzania
W przeciwieństwie do czujników niewybudzających czujniki wybudzające zapewniają, że dane są dostarczane niezależnie od stanu SoC. Gdy SoC jest aktywny, czujniki wybudzające zachowują się jak czujniki niewybudzające. Gdy SoC jest w stanie uśpienia, czujniki aktywacyjne muszą go aktywować, aby przesyłać zdarzenia. Nadal muszą pozwolić SoC na przejście w tryb zawieszenia, ale muszą też go aktywować, gdy trzeba zgłosić zdarzenie. Oznacza to, że czujnik musi obudzić SoC i przekazać zdarzenia, zanim upłynie maksymalny czas opóźnienia raportowania lub FIFO sprzętowe się zapełni. Więcej informacji znajdziesz w sekcji przetwarzanie zbiorcze.
Aby aplikacje miały czas na otrzymanie zdarzenia, zanim SoC przejdzie w stan uśpienia, sterownik musi utrzymywać „blokadę aktywacji po przekroczeniu limitu czasu” przez 200 milisekund za każdym razem, gdy zgłaszane jest zdarzenie. Oznacza to, że SoC nie może przejść w stan uśpienia w ciągu 200 milisekund po przerwaniu budzenia. Ten wymóg zostanie usunięty w przyszłej wersji Androida, ale do tego czasu potrzebujemy tej blokady aktywacji po upływie czasu.
Jak zdefiniować czujniki aktywujące i nieaktywujące?
Do wersji KitKat rodzaj czujnika (czujnik wybudzania lub niewybudzania) był określany przez typ czujnika: większość z nich była czujnikiem niewybudzającym, z wyjątkiem czujnika odległości i czujnika znaczącego ruchu.
Począwszy od L, flaga w definicji czujnika określa, czy dany czujnik jest czujnikiem budzenia. Większość czujników można zdefiniować za pomocą par wariantów czujnika: aktywowanego i nieaktywowanego. W takim przypadku muszą one zachowywać się jak 2 niezależne czujniki, które nie oddziałują na siebie nawzajem. Więcej informacji znajdziesz w sekcji Interakcje.
O ile nie określono inaczej w definicji typu czujnika, zalecamy zaimplementowanie jednego czujnika aktywacji i jednego czujnika nieaktywności dla każdego typu czujnika wymienionego w sekcji Typy czujników. W definicji każdego typu czujnika sprawdź, jaki czujnik (wybudzanie lub brak wybudzania) zostanie zwrócony przez SensorManager.getDefaultSensor(sensorType)
. Jest to czujnik, którego używa większość aplikacji.