Doze Mode
& App Standby
in Android M
David Vávra, GDE
+David Vávra
@destil
Why?
Doze mode
Triggered when:
not charging && stationary && screen is off
App Standby
Per-app Doze
App is in standby when:
no Activities && no notifications && not charging
App is woken once a day for a brief time
Android Scheduling APIs
SyncManager
Doze Mode
SyncManager
no wakelocks
no network
10 s of network & wakelock, only once in 15 mins
Device exits Doze
App Standby
SyncManager
wakelocks work
no network
The golden ticket
High-priority GCM message.
But:
Doesn’t work offline.
You might use different provider (Parse, SIP)
No SLA
Opting out
partial wakelock for Doze, no App Standby
Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
intent.setData(Uri.parse("package:com.example.app"));
startActivity(intent);
Intent intent = new Intent(Settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:com.example.app"));
startActivity(intent);
android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
Only valid use-cases! Break core feature, can’t use GCM
Testing
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
$ adb shell am set-inactive <packageName> true
$ adb shell am get-inactive <packageName>
More details
Detect whether the device is in Doze with PowerManager#isDeviceIdleMode()
Detect is your app is whitelisted with isIgnoringBatteryOptimizations(String package)
If you schedule more alarms, they are all triggered after exiting Doze.
Doze/App Standby doesn’t work on devices without Google Play Services.
More details
Maintenance windows: 5-10 mins, period 1, 2, 4, 6, 6, 6 hours.
ContentProviders in the dozed app should work.
Doze disables before user is woken by alarm clock to let apps synchronize.
Apps with foreground service are not affected by Doze.
You can register to android.os.action.DEVICE_IDLE_MODE_CHANGED
But…
that will break my app!
Use-cases & solutions
Use-case #1: Instant Messenger
The app should notify me instantly when I receive a new message.
Solution:
High-priority GCM message.
or white-listing
Use-case #2: SMS Manager
The app should notify about incoming SMS immediately.
Solution:
Some Broadcasts like SMS_RECEIVED works.
Use-case #3: Sleep Tracker
The app should monitor user’s sleep using accelerometer and microphone.
Solution:
Ask user to plug it into charger
Whitelist & Foreground service & Wakelock (buggy)
Use-case 4#: Periodic Backup
The app should backup user’s photos periodically to the cloud.
Solution:
GCM Network Manager with network & charge requirement
Foreground service for downloading
Use-case #5: Podcast Downloader
The app should download subscribed podcasts at night so they are ready for offline listening when I drive to work.
Solution:
GCM Network Manager with network requirement
Foreground service for downloading
Reschedule if fails
Use-case #6: Anti-Theft
The app should be invisible and should allow remove control of the device.
Solution:
Whitelisting
Use high-priority GCM & SMS to control device
Sources
https://developer.android.com/preview/features/power-mgmt.html
https://developers.google.com/cloud-messaging/network-manager
https://commonsware.com/blog/2015/06/03/random-musing-m-developer-preview-ugly-part-one.html
https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo
https://plus.google.com/u/0/+TomasHubalek/posts/NXZdkR29h9m
https://code.google.com/p/android-developer-preview/issues/detail?id=2233
We welcome talented Android Developers
To Prague - nice relocation package :)
http://avast.jobs.cz or ping me at vavra@avast.com
Q&A
+David Vávra
@destil