Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Don't use it or you'll lose it

GDG SPb
September 30, 2017

Don't use it or you'll lose it

Рассмотрим, как можно использовать возможности вашего устройства (в том числе, его сенсоров) и некоторые приемы UX для того, чтобы улучшить производительность и удобство использования вашего приложения.

GDG SPb

September 30, 2017
Tweet

More Decks by GDG SPb

Other Decks in Programming

Transcript

  1. Android developer since 2009 Tech community activist, speaker and founder

    Mentor at * accelerator Introduction Royi Benyossef
  2. Android developer since 2009 Tech community activist, speaker and founder

    Mentor at * accelerator Google expert since 2013 Introduction Royi Benyossef
  3. Android developer since 2009 Tech community activist, speaker and founder

    Mentor at * accelerator Google expert since 2013 Ecosystem relations manager at Samsung NEXT Tel-Aviv Introduction Royi Benyossef
  4. Introduction Samsung Next Tel-aviv Software and services startups and products:

    - Early stage investments (seed round to round B) - Product creation
  5. Introduction Samsung Next Tel-aviv Software and services startups and products:

    - Early stage investments (seed round to round B) - Product creation - M&A
  6. Introduction Samsung Next Tel-aviv Software and services startups and products:

    - Early stage investments (seed round to round B) - Product creation - M&A Contact: [email protected]
  7. Prologue We use apps everywhere Our desires change based on

    the environment What seems to be the problem?
  8. Prologue We use apps everywhere Our desires change based on

    the environment Apps must adapt What seems to be the problem?
  9. Prologue Problem example Apps need data Wi-Fi data is free

    3G/4G data costs money All of them drain the battery
  10. Prologue Problem example Apps need data Wi-Fi data is free

    3G/4G data costs money All of them drain the battery Users don’t like losing money or battery!
  11. Prologue Problem example Apps need data Wi-Fi data is free

    3G/4G data costs money All of them drain the battery Users don’t like losing money or battery! However...
  12. Prologue Problem example Apps need data Wi-Fi data is free

    3G/4G data costs money All of them drain the battery Users don’t like losing money or battery! Users want the best UX! the second she wakes up... Does not like waiting! Wants fresh data...
  13. Prologue Problem example Apps need data Wi-Fi data is free

    3G/4G data costs money All of them drain the battery Users don’t like losing money or battery! Users want the best UX! Internet is not everywhere!!!
  14. Prologue Problem example Apps need data Wi-Fi data is free

    3G/4G data costs money All of them drain the battery Users don’t like losing money or battery! Users want the best UX! Internet is not everywhere!!! (= Example: metro!)
  15. Battery Glossary Radio: That thing that connects you to cell

    towers • Phone calls + SMS + internet
  16. Battery Glossary Radio (= internet) Radio baseline mode (does nothing,

    uses nothing) Radio download mode: • Radio working at full power
  17. Battery Glossary Radio (= internet) Radio baseline mode (does nothing,

    uses nothing) Radio download mode: Radio working at full power • POWER!!! (400 mA)
  18. Battery Glossary Radio (= internet) Radio baseline mode (does nothing,

    uses nothing) Radio download mode (working, needs POWER!!!) Radio idle mode
  19. Battery Glossary Radio (= internet) Radio baseline mode (does nothing,

    uses nothing) Radio download mode (working, needs POWER!!!) Radio idle mode: Does (almost) nothing • Still uses power
  20. Battery Glossary Radio (= internet) Radio baseline mode (does nothing,

    uses nothing) Radio download mode (working, needs POWER!!!) Radio idle mode: Does (almost) nothing • Still uses power (300 mA)
  21. Battery Glossary Radio (= internet) Radio baseline mode (does nothing,

    uses nothing) Radio download mode (working, needs POWER!!!) Radio idle mode: Does (almost) nothing Still uses power (300 mA) • Lasts up to 90 seconds
  22. Battery Glossary Radio (= internet) Radio baseline mode (does nothing,

    uses nothing) Radio download mode (working, needs POWER!!!) Radio idle mode: Does (almost) nothing Still uses power (300 mA) • Lasts up to 90 seconds (!!!)
  23. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: • Phone radio is at “baseline”
  24. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: Phone radio is at “baseline” • App A needs to fetch from server
  25. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: Phone radio is at “baseline” App A needs to fetch from server • Radio goes to “download”
  26. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: Phone radio is at “baseline” App A needs to fetch from server Radio goes to “download” • Data downloaded
  27. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: Phone radio is at “baseline” App A needs to fetch from server Radio goes to “download” Data downloaded • Radio goes to “idle”
  28. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: Phone radio is at “baseline” App A needs to fetch from server Radio goes to “download” Data downloaded Radio goes to “idle” • Radio waits 90 seconds (in “idle”)
  29. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: Phone radio is at “baseline” App A needs to fetch from server Radio goes to “download” Data downloaded Radio goes to “idle” Radio waits 90 seconds (in “idle”) • Radio goes to “baseline”
  30. Battery Glossary Radio (= internet, modes = baseline, download, idle)

    Workflow: Phone radio is at “baseline” App A needs to fetch from server Radio goes to “download” Data downloaded Radio goes to “idle” Radio waits 90 seconds (in “idle”) Radio goes to “baseline”
  31. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes)
  32. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00)
  33. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced)
  34. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A update (every 60 minutes)
  35. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A update (every 60 minutes) 09:35 - App G update (every 2 hours)
  36. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A update (every 60 minutes) 09:35 - App G update (every 2 hours) ...
  37. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A update (every 60 minutes) 09:35 - App G update (every 2 hours) ... 13:30 - Royi checks the phone in his pocket
  38. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A update (every 60 minutes) 09:35 - App G update (every 2 hours) ... 13:30 - Royi checks the phone in his pocket (= 55% battery)
  39. Battery Real workflow 08:00 - Royi puts phone in pocket

    08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A update (every 60 minutes) 09:35 - App G update (every 2 hours) ... 13:30 - Royi checks the phone in his pocket (= 55% battery?!)
  40. Battery Let sleeping radios lie Use call batching enabled API

    - Letting Android batch calls according to time and urgency
  41. Battery Let sleeping radios lie Use call batching enabled API

    Letting Android batch calls according to time and urgency - Less calls = same data with less idle time = PROFIT!
  42. Battery Let sleeping radios lie Before batching 08:00 - Royi

    puts phone in pocket 08:15 - App A update (every 60 minutes) 09:00 - App B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A update (every 60 minutes) 09:35 - App G update (every 2 hours) ... 13:30 - Royi checks the phone in his pocket
  43. Battery Let sleeping radios lie After batching 08:00 - Royi

    puts phone in pocket 08:15 - App A update (every 60 minutes) 09:00 - App A,B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A,C update (every 60 minutes) 09:35 - App G update (every 2 hours) ... 13:30 - Royi checks the phone in his pocket
  44. Battery Let sleeping radios lie Use call batching enabled API:

    • FCM network manager (requires Google Play Services)
  45. Battery Let sleeping radios lie Use call batching enabled API:

    FCM network manager (requires Google Play Services) • JobScheduler
  46. Battery Let sleeping radios lie Use call batching enabled API:

    FCM network manager (requires Google Play Services) • JobScheduler (requires Android 5.0+)
  47. Battery Let sleeping radios lie Use call batching enabled API:

    FCM network manager (requires Google Play Services) JobScheduler (requires Android 5.0+) • SyncAdapter
  48. Battery Let sleeping radios lie Use call batching enabled API:

    FCM network manager (requires Google Play Services) JobScheduler (requires Android 5.0+) • SyncAdapter (complex implementation)
  49. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications - Push receivers work while radio is at baseline mode
  50. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Push receivers work while radio is at baseline mode - The server notifies you when something changed
  51. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Push receivers work while radio is at baseline mode The server notifies you when something changed - Nothing’s changed, cancel call = no wasted idle and downloading times
  52. Battery Let sleeping radios lie Before push 08:00 - Royi

    puts phone in pocket 08:15 - App A update (every 60 minutes) 09:00 - App A,B update (every day at 09:00) 09:07 - App C update (FCM induced) 09:15 - App A,C update (every 60 minutes) 09:35 - App G update (every 2 hours) ... 13:30 - Royi checks the phone in his pocket
  53. Battery Let sleeping radios lie After push 08:00 - Royi

    puts phone in pocket 08:55 - App A push (FCM induced) 09:00 - App A,B update (every day at 09:00) 09:07 - App C push (FCM induced) 09:15 - App A,C update (batched) 09:35 - App G update (every 2 hours) ... 13:30 - Royi checks the phone in his pocket
  54. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API
  55. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API - Searching for connectivity is more costly than calls
  56. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API Searching for connectivity is more costly than calls - App level queries keeps app loaded and the CPU running
  57. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API Searching for connectivity is more costly than calls App level queries keeps app loaded and the CPU running - Apps rarely use exponential back-off algorithms
  58. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API: • ConnectivityManager
  59. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API: • ConnectivityManager (one batched check for all apps, not keeping app loaded)
  60. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API: ConnectivityManager (one batched check for all apps) • Schedulers
  61. Battery Let sleeping radios lie Use call batching enabled API

    Use FCM push notifications Use system connectivity check API: ConnectivityManager (one batched check for all apps) • Schedulers (use ConMag automatically, use exponential back-off)
  62. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when: Screen is off • Stationary (not moving = on a desk/stand)
  63. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when: Screen is off Stationary (not moving = on a desk/stand) • Not charging
  64. Battery appendix Doze Was Introduced as part of Lollipop Doze

    applies when device is unused & not charging Doze was improved as part of Marshmallow
  65. Battery appendix Doze Was Introduced as part of Lollipop Doze

    applies when device is unused & not charging Doze was improved as part of Marshmallow to detect: • Activity = walking
  66. Battery appendix Doze Was Introduced as part of Lollipop Doze

    applies when device is unused & not charging Doze was improved as part of Marshmallow to detect: Activity = walking • Screen off
  67. Battery appendix Doze Was Introduced as part of Lollipop Doze

    applies when device is unused & not charging Doze was improved as part of Marshmallow to detect: Activity = walking Screen off • Not charging
  68. Battery appendix Doze Was Introduced as part of Lollipop Doze

    applies when device is unused & not charging Doze was improved as part of Marshmallow to detect: • Device is in-pocket/in-bag
  69. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied
  70. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied: • It blocks all network operations
  71. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied: • It blocks all network operations (except for “maintenance windows”)
  72. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied it forces network batching
  73. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied it forces network batching To comply
  74. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied it forces network batching To comply: • Test app while in doze mode
  75. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied it forces network batching To comply: Test app while in doze mode • If applicable - set right priority for AlarmManager
  76. Battery appendix Doze Was Introduced as part of Lollipop Applies

    when device is unused & not charging When applied it forces network batching To comply: Test app while in doze mode • If applicable - set right priority for AlarmManager (=setAndAllowWhileIdle()/setExactAndAllowWhileIdle())
  77. Battery appendix Before Doze 23:00 - Royi goes to sleep

    00:00 - App B update 01:13 - App E update 02:00 - App C, D update 03:15 - App A update 04:00 - App B, D update 05:30 - Royi checks phone on night stand
  78. Battery appendix Before Doze 23:00 - Royi goes to sleep

    00:00 - App B update 01:13 - App E update 02:00 - App C, D update 03:15 - App A update 04:00 - App B, D update 05:30 - Royi checks phone on night stand 05:31 - Royi is angry because he has 23% battery
  79. Battery appendix After Doze 23:00 - Royi goes to sleep

    00:00 - App B update 01:30 - App B,E update 02:00 - App C, D update 03:15 - App A update 04:00 - App A, B, C, D update 05:30 - Royi checks phone on nightstand
  80. Battery appendix After Doze 23:00 - Royi goes to sleep

    00:00 - App B update 01:30 - App B,E update 02:00 - App C, D update 03:15 - App A update 04:00 - App A, B, C, D update 05:30 - Royi checks phone on nightstand 05:31 - Royi is happy because he has 43% battery
  81. Network usage Motivation reminder Battery saved by using the radio

    more efficiently: (= Less calls = less “radio idle mode time”)
  82. Network usage Motivation reminder Battery saved by reducing “radio idle

    mode time” - Done! To do: • Reducing radio download mode time
  83. Network usage Motivation reminder Battery saved by reducing “radio idle

    mode time” - Done! To do: Reducing radio download mode time • Improving UX while reducing radio download time
  84. Network usage The problem with polling Calling the backend even

    if nothing changed Re-downloading data again and again
  85. Network usage The problem with polling Calling the backend even

    if nothing changed Re-downloading data again and again (+ redundant download mode time)
  86. Network usage The problem with polling Calling the backend even

    if nothing changed Re-downloading data again and again (+ redundant download mode time) (+ wasting data plan)
  87. Network usage The problem with polling Calling the backend even

    if nothing changed Re-downloading data again and again (+ redundant download mode time) (+ wasting data plan)
  88. Network usage Fetching fetchingly Optimize fetching methods: • Freshness headers

    Smaller download time footprint - Easy impl. on both client and server
  89. Network usage Fetching fetchingly Optimize fetching methods: • Freshness headers

    Smaller download time footprint Easy impl. - Con: still polling (+ Idle mode time)
  90. Network usage Fetching fetchingly Optimize fetching methods: Easy (freshness headers)

    • FCM push: - Good performance (= No Idle, No download)
  91. Network usage Fetching fetchingly Optimize fetching methods: Easy (freshness headers)

    Medium (push update notification) • Advanced (real time databases)
  92. Network usage Fetching fetchingly Optimize fetching methods Optimize payloads: Diff

    only Gzip compression • Advanced formats (FlatBuffers)
  93. Network usage Fetching fetchingly Optimize fetching methods Optimize payloads: Diff

    only Gzip compression Advanced formats (FlatBuffers) • Segmentation
  94. Network usage Fetching fetchingly Optimize fetching methods Optimize payloads: Diff

    only Gzip compression Advanced formats (FlatBuffers) • Segmentation (paging & indexing)
  95. Anticipate your users Available data points to consider Misc. device

    listeners: Screen state (on/off) • Network state
  96. Anticipate your users Available data points to consider Misc. device

    listeners: Screen state (on/off) • Network state (3G, WiFi, nothing)
  97. Anticipate your users Available data points to consider Misc. device

    listeners: Screen state (on/off) Network state (3G, WiFi, nothing) • Battery state
  98. Anticipate your users Available data points to consider Misc. device

    listeners: Screen state (on/off) Network state (3G, WiFi, nothing) • Battery state (OK, low, charging)
  99. Anticipate your users Available data points to consider Misc. device

    listeners: Screen state (on/off) Network state (3G, WiFi, nothing) Battery state (OK, low, charging) • Dock state
  100. Anticipate your users Available data points to consider Misc. device

    listeners: Screen state (on/off) Network state (3G, WiFi, nothing) Battery state (OK, low, charging) • Dock state (none, car, desk)
  101. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API
  102. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: • Activity
  103. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: • Activity (walking, running, cycling, driving, stationary)
  104. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: Activity (walking, running, cycling, driving, stationary) • Location
  105. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: Activity (walking, running, cycling, driving, stationary) • Location (Lat/Long, Google Places)
  106. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: Activity (walking, running, cycling, driving, stationary) Location (Lat/Long, Google Places) • Physical web
  107. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: Activity (walking, running, cycling, driving, stationary) Location (Lat/Long, Google Places) • Physical web (Beacons nearby)
  108. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: Activity (walking, running, cycling, driving, stationary) Location (Lat/Long, Google Places) Physical web (Beacons nearby) • Headphones
  109. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: Activity (walking, running, cycling, driving, stationary) Location (Lat/Long, Google Places) Physical web (Beacons nearby) • Headphones (yes/no)
  110. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API: Activity (walking, running, cycling, driving, stationary) Location (Lat/Long, Google Places) Physical web (Beacons nearby) • Headphones (yes/no) - take that iPhone users!
  111. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) - Supported back to Froyo (2.2)
  112. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) - *Supported back to Froyo (2.2)
  113. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) - *Supported back to Froyo (2.2) *Caution: getBeaconState() is only supported on devices running API level 18 (Jelly Bean) or higher. If calling from a device running an earlier version, getStatus() will return status code API_NOT_AVAILABLE.
  114. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) *Supported back to Froyo (2.2) - Permissions: - Beacons & location = FINE_LOCATION
  115. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) *Supported back to Froyo (2.2) - Permissions: Beacons & location = FINE_LOCATION - Activity = ACTIVITY_RECOGNITION
  116. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) *Supported back to Froyo (2.2) - Permissions: Beacons & location = FINE_LOCATION Activity = ACTIVITY_RECOGNITION - Headphones & time = NONE
  117. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) *Supported back to Froyo (2.2) Permissions needed - Outputs
  118. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) *Supported back to Froyo (2.2) Permissions needed - Outputs: - Snapshot
  119. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) *Supported back to Froyo (2.2) Permissions needed - Outputs: - Snapshot = current user’s context
  120. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) *Supported back to Froyo (2.2) Permissions needed - Outputs: Snapshot = current user’s context - Fence = register a listener (flag or combo)
  121. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) Misc.
  122. Anticipate your users Available data points to consider Misc. device

    listeners (screen, network, battery, dock) Awareness API (Activity, location, Beacons, Headphones) Misc. (time, calendar and schedule)
  123. Anticipate your users Available data points to consider • Connectivity

    • Battery • Activity • Location • Time of day • Calendar • Weather • Ear phones yes/no
  124. Anticipate your users Connectivity On Wi-Fi: Feel free to fetch

    more often • Fetch data for later (*if you can cache it)
  125. Anticipate your users Connectivity On Wi-Fi: Feel free to fetch

    more often • Fetch data for later (you MUST cache it)
  126. Anticipate your users Activity On the go (depends) On the

    couch? • Stationary • Location = home/office • Connectivity = Wi-Fi • No upcoming meetings?
  127. Anticipate your users Activity On the go (depends) On the

    couch? • Stationary • Location = home/office • Connectivity = Wi-Fi • No upcoming meetings? = Go absolutely wild!
  128. Anticipate your user Battery is low: - Good ideas: -

    Give the user a choice Consider the following
  129. Anticipate your user Battery is low: - Good ideas: Give

    the user a choice - Decrease activity Consider the following
  130. Anticipate your user Battery is low: - Good ideas: Give

    the user a choice - Decrease activity (unless you’re mission critical) Consider the following
  131. Anticipate your user You’re on Wi-Fi: - Bad idea =

    update ALL!!! Consider the following
  132. Anticipate your user You’re on Wi-Fi: Bad idea = update

    ALL!!! - Good idea = update more Consider the following
  133. Anticipate your user You’re on Wi-Fi: Bad idea = update

    ALL!!! - Good idea = update more (ONLY what you’ll use) Consider the following
  134. Anticipate your user User running in the park w/ headphones:

    - Good idea = start playing a playlist Consider the following
  135. Anticipate your user User running in the park w/ headphones:

    Good idea = start playing a playlist - Bad idea = fetch data for a news app Consider the following
  136. Anticipate your user Running+park+headphones = playlist Running+alley-headphones: Bad idea =

    start playing a playlist - Good idea = loud alarm Consider the following
  137. Anticipate your user Running+park+headphones = playlist Running+alley-headphones: Bad idea =

    start playing a playlist - Good idea = loud alarm + speed dial police Consider the following