Diese Extension ist veraltet und wird nicht weiter gepflegt.
Sie wurde ersetzt durch UrsAi2KeepAwake, eine komplett überarbeitete und erweiterte Version mit zusätzlichen Optionen.
Version | Anpassungen |
---|---|
1.0 (2020-03-07) | Initiale Version |
1.1 (2020-07-16) | Methoden hinzugefügt (Abschnitt Akku Optimierung, s.u.): - RequestIgnoreBatteryOptimization - IsIgnoringBatteryOptimizations - OpenBatteryOptimizationSettings |
1.2 (2020-08-05) | Release() hatte keine Wirkung. |
1.3 (2020-08-08) | Mehrfacher Aufruf von Release führte zu einer Exception. |
1.4 (2021-01-26) | WifiLock hinzugefügt. |
1.5 (2021-03-21) | - Eigenschaften Version und VersionSDK
hinzugefügt. - SDK-Versionsprüfung bei Funktionen zur Einstellung der Akku-Optimierung. - Fehler bei RequestIgnoreBatteryOptimization behoben. |
1.6 (2021-04-09) | Methode IsRunningInCompanion hinzugefügt. Hinweis: Die Beispiele sind nicht betroffen und enthalten noch die Version 1.5 der Extension. |
1.7 (2021-07-20) | Eigenschaften OnAfterRelease, AcquireCausesWakeup und Methoden AquireFullWakeLock, EnableShowOnLockScreen hinzugefügt. |
Für manche Projekte ist es notwendig zu verhindern, dass die zugehörige App vom Betriebssystem deaktiviert wird. In frühen Android Versionen war es möglich, einen sogenannten WakeLock zu setzen. Dieser bewirkte, dass die App vom Betriebssystem nicht abgeschaltet wurde.
Mit der Version 6.0 (Marshmallow) hat Android den Doze-Modus zur Optimierung der Akku-Laufzeiten eingeführt. Diese Funktion schaltet, wenn keine App aktiv bedient wird, nach und nach alles herunter (Display, CPU, WiFi, etc.). Auch die WakeLock-Funktion wurde z.T. außer Kraft gesetzt.
Der MIT App Inventor bietet leider keine wirklich funktionierende Möglichkeit, dem Abschalten entgegen zu wirken. Zwar kann man die Komponente Clock als Timer einsetzen und auch einstellen, dass die Events im Hintergrund ausgelöst werden (TimerAlwaysFires). Bei meinem Smartphone mit der Android-Version Oreo 8.1 war jedoch das, was bei bei einem Timer-Event möglich ist, sehr eingeschränkt. Netzwerkfunktionen standen z.B. nicht zur Verfügung.
Mit der hier beschriebenen Extension kann man erreichen, dass die CPU nicht abgeschaltet wird und die App über einen langen Zeitraum aktiv bleibt.
Viele nützliche Hintergrundinformationen findet man im ZEBRA Developer Portal: Keeping your Android application running when the device wants to sleep.
Inhaltsverzeichnis
Das ZIP-Archiv UrsAI2WakeLock zum Download. Das Archiv enthält den Quellcode, das kompilierte Binary zum Upload in den App Inventor und eine Beispiel-Anwendung.
Hinweis: Die Extension funktioniert nicht im Companion. Dort fehlt die WAKE_LOCK-Permission. Evtl. kann man sich hierüber behelfen: Patchen des AI2 Companion - zusätzliche Permissions.
Im Prinzip geht es um drei Anwendungsfälle:
Android bietet folgende Lösungsmöglichkeiten für diese Fälle:
Android hat seine Powermanagement-Policy häufig geändert. Man sollte also unbedingt testen, ob die hier gemachten Angaben für das eigen Projekt zutreffen.
Ein Wakelock schützt nicht davor, dass die Netzwerk-Verbindung nach einer gewissen Zeit gekappt wird. Hierzu gibt es den WifiLock. Er ermöglicht einer Anwendung, die WLAN-Verbindung aktiv zu halten. Normalerweise wird die WiFi-Hardware ausgeschaltet, wenn der Benutzer das Gerät längere Zeit nicht benutzt hat. Wenn ein WifiLock gesetzt wird, bleibt die Hardware eingeschaltet, bis die Sperre aufgehoben wird.
Neben den Methoden zur Einrichtung eines WakeLocks bietet Android drei Methoden mit denen auf die Akku Optimierung eingewirkt werden kann. Dazu gibt es die Möglichkeit über die Einstellungen (Settings) die Akku-Optimierung abzuschalten (s. u. Einstellungen zur Akku-Optimierung).
Die Android-Dokumentation verweist auf eine Whitelist. Leider ist mir bei meinem Gerät nicht klar, was die genauen Auswirkungen sind. Die Dinge sind auch nicht stimmig. Vielleicht liegt das auch an der (deutschen) Implementierung von Xiaomi beim Redmi 5. Leider habe ich kein anderes Gerät um das zu überprüfen. Deshalb verweise ich auf die Android-Dokumentation.
Die Methode RequestIgnoreBatteryOptimization fragt beim Anwender an, die Akku-Optimierung für die App auszuschalten. Nach Aufruf der Methode erscheint diese Anfrage:
Den Punkt "Apps & Benachrichtigungen" gibt es bei meinem Gerät nicht :-(
Ob die App auf der Whitelist steht, kann über die Eigenschaft IsIgnoringBatteryOptimizations abgefragt werden. OpenBatteryOptimizationSettings öffnet einen Dialog, über den die Whitelist manuell gepflegt werden kann.
Android erlaubt es, den Energiesparmodus für einzelne Apps gezielt auszuschalten. Hier die Anleitung für mein Smartphone (Xiaomi Redmi 5 Plus) mit Android Oreo 8.1:
App Einstellungen, dort im Suchfeld "akku" eingeben "Akku-Optimierung auswählen. |
||
"App-Energiesparen auswählen. | ||
Die betreffende App auswählen. Wenn die betreffende App gestartet ist, findet man sie unter "Aktive App", sonst in der Liste "Schlafende Apps" darunter. Man kann auch nach der App suchen. |
||
Punkt "Energiesparen auswählen. Dieser Schritt entfällt bei "Schlafender App". |
||
"Keine Beschränkung" auswählen. Der Standard-Modus ist "Energiesparmodus". Der bewirkt, dass die App abgeschaltet wird. |
Eine kleine Beispiel-App zeigt die Verwendung der Extension (s. Download).
Im oberen Teil wird eine laufenden Uhr angezeigt. Um auch eine im Hintergrund laufende App kontrollieren zu können, wird alle zehn Sekunden ein Broadcast-Paket per UDP mit der aktuellen Uhrzeit versandt.
Über die Schaltflächen können die verschiedenen WakeLocks gesetzt werden. Die Checkbox zeigt an, ob ein WakeLock aktiv ist (Auswertung der Eigenschaft IsActive). Darunter wird angezeigt, welcher Typ WakeLock aktiv ist (Auswertung der Eigenschaft WakeLockType).
Mir der Beispiel-App habe ich folgende Szenarien getestet.
Szenario | Ergebnis | |
---|---|---|
Lock-Typ | Energiesparmodus | |
keiner | ein (das ist der Standard nach Installation der App) | Dies ist der Regelfall. Das Display wird bei fehlender Bedienung nach etwa zehn Sekunden abgedunkelt und nach weiteren fünf Sekunden abgeschaltet. Die App läuft noch einige Zeit weiter, z.T. einige Minuten. Diese Zeit ist aber nicht fix, sondern war bei jedem Versuch unterschiedlich. |
keiner | aus (gemäß Anleitung bei "Einstellungen zur Akku-Optimierung") | Der Bildschirm wird abgeschaltet, die App sendet jedoch weiter. Die Zeitintervalle werden nicht einhalten, der Versandt der UDP-Pakete erfolgt unregelmäßig. |
SCREEN_BRIGHT_WAKE_LOCK SCREEN_DIM_WAKE_LOCK |
unerheblich |
Solange die App im Vordergrund ist, bleibt sie aktiv, ggf. wird das Display abgedunkelt. Der Versandt der UDP-Pakete erfolgt zu den vorgegebenen Zeiten. Wird die App in den Hintergrund verlagert, verhält sich das System wie im Regelfall. |
PARTIAL_WAKE_LOCK | ein | Keine Wirkung, die App verhält sich wie im Regelfall. |
aus |
Bei App im Vordergrund werden die UDP-Pakete sauber verschickt. Wird die App in den Hintergrund verschoben, wird der UDP-Versand nach einiger Zeit unregelmäßig. |
Messungen | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
Energiesparmodus: | ein | ein | ein | ein | aus | aus | aus | aus |
Vordergrund (VG) Hintergrund (HG) |
VG | HG | VG | HG | VG | HG | VG | HG |
PARTIAL_WAKE_LOCK | nein | nein | ja | ja | nein | nein | ja | ja |
18:59:50 19:01:51 19:03:52 19:04:33 19:04:51 stopp |
18:49:10 18:49:20 18:49:44 18:49:51 18:50:35 18:50:40 18:50:51 18:51:40 18:51:52 18:52:30 18:52:44 stopp |
19:38:10 19:38:20 19:38:30 19:38:40 19:38:50 19:39:00 19:39:10 19:39:20 19:39:30 19:39:40 19:39:50 19:40:00 19:40:10 19:40:20 19:40:30 19:40:40 19:40:50 19:41:00 19:41:10 19:41:20 19:41:30 stopp |
19:54:30 19:54:40 19:54:50 19:55:00 19:55:10 19:55:20 19:55:30 19:56:49 19:57:21 19:58:01 19:58:33 stopp |
22:04:02 22:04:20 22:04:59 22:05:00 22:05:31 22:07:22 22:08:01 22:09:14 22:11:52 22:14:10 ... Extrem unregelmäßig mit Aussetzern |
22:23:04 22:24:05 22:25:06 22:26:06 22:26:30 22:27:07 22:27:22 22:28:59 22:29:00 22:29:15 22:29:31 ... Extrem unregelmäßig mit Aussetzern |
06:03:00 06:03:10 06:03:20 06:03:30 06:03:40 06:03:50 06:04:00 06:04:10 06:04:20 06:04:30 06:04:40 ..... 07:07:20 07:07:30 07:07:40 07:07:50 07:08:00 07:08:10 ... Präzise |
07:09:20 07:09:30 07:09:40 07:09:50 07:10:00 07:10:10 07:10:28 07:10:30 07:10:43 .... 07:26:20 07:27:06 07:27:22 07:27:41 07:29:14 ... Zuerst präzise, dann sehr unregelmäßig |
Für die Erstellung eigener Extensions habe ich einige Tipps zusammengestellt: AI2 FAQ: Extensions entwickeln.