1 of 22

Doze Mode

& App Standby

in Android M

David Vávra, GDE

+David Vávra

@destil

2 of 22

Why?

3 of 22

Doze mode

Triggered when:

not charging && stationary && screen is off

4 of 22

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

5 of 22

Android Scheduling APIs

SyncManager

6 of 22

Doze Mode

SyncManager

no wakelocks

no network

10 s of network & wakelock, only once in 15 mins

Device exits Doze

7 of 22

App Standby

SyncManager

wakelocks work

no network

8 of 22

The golden ticket

High-priority GCM message.

But:

Doesn’t work offline.

You might use different provider (Parse, SIP)

No SLA

9 of 22

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

10 of 22

Testing

$ adb shell dumpsys battery unplug

$ adb shell dumpsys deviceidle step

$ adb shell am set-inactive <packageName> true

$ adb shell am get-inactive <packageName>

11 of 22

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.

12 of 22

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

13 of 22

But…

that will break my app!

Use-cases & solutions

14 of 22

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

15 of 22

Use-case #2: SMS Manager

The app should notify about incoming SMS immediately.

Solution:

Some Broadcasts like SMS_RECEIVED works.

16 of 22

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)

17 of 22

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

18 of 22

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

19 of 22

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

20 of 22

Sources

21 of 22

We welcome talented Android Developers

To Prague - nice relocation package :)

http://avast.jobs.cz or ping me at vavra@avast.com

22 of 22

Q&A

+David Vávra

@destil