Android 10 wprowadza opcję harmonogramu oszczędzania baterii o nazwie Na podstawie rutyny. Ta opcja umożliwia aplikacji wybranej przez producenta OEM wysyłanie do systemu sygnałów, które pozwalają na bardziej inteligentne planowanie oszczędzania baterii. Ta opcja wymaga konfiguracji i jest opcjonalna.
Konfiguracja urządzenia
W tej sekcji opisujemy, jak skonfigurować urządzenie pod kątem opcji Na podstawie rutyny.
Specyfikacja dostawcy
Aby powiadomić interfejs Ustawienia , że urządzenie jest prawidłowo skonfigurowane, użyj nakładki konfiguracji, aby zastąpić wartość config_batterySaverScheduleProvider nazwą pakietu aplikacji. Jeśli na przykład chcesz, aby aplikacja com.google.android.apps.turbo kontrolowała ustawienie Na podstawie rutyny , ustaw tę wartość konfiguracji:
<string name="config_batterySaverScheduleProvider" translatable="false">
com.google.android.apps.turbo</string>
Aby to sprawdzić, skompiluj obraz, wgraj go na urządzenie i otwórz Ustawienia
Bateria > Oszczędzanie baterii > Harmonogram oszczędzania baterii. Wyświetli się opcja Na podstawie rutyny.
Domyślny próg wyłączenia
Pole config_dynamicPowerSavingsDefaultDisableThreshold określa poziom baterii, przy którym system wyłącza Oszczędzanie baterii, jeśli zostało ono włączone przez harmonogram Na podstawie rutyny. Domyślna wartość systemowa to 80%, ale możesz ją zmienić.
Konfiguracja aplikacji
W tej sekcji opisujemy, jak skonfigurować aplikację do korzystania z opcji Na podstawie rutyny.
Uprawnienia
Interfejsy API niezbędne do włączenia oszczędzania baterii na podstawie rutyny są chronione uprawnieniem android.permission.POWER_SAVER. Jest to uprawnienie sygnatury lub uprzywilejowane. Oznacza to, że aplikacja musi znajdować się w katalogu priv-app w obrazie systemu i musisz wyraźnie przyznać jej to uprawnienie.
W przypadku aplikacji uprzywilejowanych musisz przyznać uprawnienia w pliku XML konfiguracji systemu w katalogu /etc/permissions/ na tej samej partycji co aplikacja. Aby na przykład przyznać uprawnienie android.permission.POWER_SAVER aplikacji o nazwie pakietu com.google.android.apps.turbo:
<!-- File located at /etc/permissions/privapp-permissions-DEVICE_NAME.xml -->
<permissions>
<privapp-permissions package="com.google.android.apps.turbo">
<permission name="android.permission.POWER_SAVER"/>
</privapp-permissions>
</permissions>
Jeśli nie przyznasz tego uprawnienia aplikacji w obrazie systemu, nie będzie ona mogła go uzyskać ani prawidłowo wywołać interfejsów API. System nie przekazuje informacji zwrotnych poza standardowymi błędami uprawnień, dlatego ważne jest, aby sprawdzić, czy aplikacja może wywoływać interfejsy API i obserwować ich działanie.
Instalacja
Aby opcja Na podstawie rutyny działała prawidłowo, musisz wstępnie zainstalować aplikację w obrazie systemu z wymaganym uprawnieniem. Przyznaj uprawnienie android.permission.POWER_SAVER tylko jednej aplikacji i pozwól jej kontrolować interfejsy API Na podstawie rutyny. Jeśli więcej niż 1 aplikacja próbuje używać tego uprawnienia i interfejsów API, działanie funkcji jest nieobsługiwane i nieokreślone.
Włączanie oszczędzania baterii na podstawie rutyny
W tej sekcji opisujemy, jak aplikacja może włączyć oszczędzanie baterii Na podstawie rutyny za pomocą udostępnionych interfejsów API.
Interfejsy API
Jeśli konfiguracja się powiedzie, aplikacja OEM określona w konfiguracji może prawidłowo wywołać powiązaną metodę w PowerManager, aby włączyć oszczędzanie baterii:
public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold)
Jeśli opcja harmonogramu oszczędzania baterii Na podstawie rutyny jest włączona, a aplikacja wywołuje tę metodę z wartością true dla powerSaveHint, oszczędzanie baterii zostanie włączone. Określ disableThreshold, aby w przypadku, gdy aplikacja nie może komunikować się z systemem, system nadal wiedział, przy jakim poziomie naładowania baterii można bezpiecznie wyłączyć oszczędzanie baterii.
Ten interfejs API podlega zastępowaniu przez użytkownika i odroczeniu oszczędzania baterii w taki sam sposób jak automatyczne oszczędzanie baterii na podstawie procentu. Więcej informacji znajdziesz w dokumentacji API.
Aby sprawdzić, czy interfejsy API są wywoływane prawidłowo, wysyłaj zapytania do ustawień globalnych, aby
potwierdzić, że wartość ustawienia zapasowego zmieniła się zgodnie z wywołaniami interfejsu API.
Jeśli na przykład wybierzesz tryb oszczędzania baterii Na podstawie rutyny, a aplikacja wywoła setDynamicPowerSaveHint(true, 10), ustawienia globalne będą miały te wartości:
automatic_power_save_mode: 1
dynamic_power_savings_disable_threshold: 10
dynamic_power_savings_enabled: 1
Jeśli następnie wywołasz setDynamicPowerSaveHint(false, 25), wartości będą takie:
automatic_power_save_mode: 1
dynamic_power_savings_disable_threshold: 25
dynamic_power_savings_enabled: 0
Możesz sprawdzić te wartości za pomocą tego polecenia adb:
adb shell settings get global <setting-name>
Weryfikacja
Nie ma automatycznego sposobu weryfikacji tej funkcji, ponieważ producent OEM określa zachowanie, które włącza tryb oszczędzania baterii Na podstawie rutyny. Producenci OEM muszą przetestować integrację, aby sprawdzić, czy zachowanie jest zgodne z oczekiwaniami. W szczególności sprawdź, czy urządzenie może wykonywać te zadania:
- Na podstawie procentu: jeśli w interfejsie Harmonogram oszczędzania baterii wybierzesz Na podstawie procentu i ustawisz 15%, oszczędzanie baterii włączy się automatycznie tylko wtedy, gdy poziom naładowania baterii osiągnie 15%.
- Na podstawie rutyny: jeśli w interfejsie Harmonogram oszczędzania baterii wybierzesz Na podstawie rutyny , oszczędzanie baterii włączy się, gdy aplikacja wywoła interfejs API z wartością
true. Oszczędzanie baterii wyłączy się też automatycznie, jeśli urządzenie zostanie naładowane do wskazanego progu i odłączone od zasilania. - Brak: jeśli w interfejsie Harmonogram oszczędzania baterii wybierzesz Brak , oszczędzanie baterii nigdy nie włączy się automatycznie.
- Ręczne zastąpienie: jeśli aplikacja włączy oszczędzanie baterii, a Ty ręcznie je wyłączysz (za pomocą Szybkich ustawień, Ustawień lub innych metod), pozostanie ono wyłączone, dopóki nie włączysz go ponownie ręcznie lub nie podłączysz urządzenia do zasilania.