When your app is asleep (Droidcon UA & Droidcon UK 2017)

When your app is asleep (Droidcon UA & Droidcon UK 2017)

Features we can use to improve ux, when the users aren't engaging with the app.

Also here: https://goo.gl/qLyc8G

3142db3adb711e247e371153b5777e04?s=128

Britt Barak

October 27, 2017
Tweet

Transcript

  1. When your app’s asleep Britt Barak

  2. None
  3. Avg ~2 minutes/day

  4. OR 23 hours and 58 minutes unuse

  5. Being minded to UX When your app is asleep.

  6. Britt Barak Android Lead Android Academy TLV Women Techmakers IL

  7. Let’s begin!

  8. None
  9. Be relevant

  10. Notification

  11. Users love them! 125% higher retention 88% more engagement

  12. Users hate them! #1 for uninstalls 52% are annoyed

  13. BigPicture(16+) new Notification.BigPictureStyle() setStyle() BigText(16+) new Notification.BigTextStyle()

  14. Inbox(16+) new Notification.InboxStyle() setStyle() Messaging(24+) new Notification.MessagingStyle("Me")

  15. Media (21+) setStyle()

  16. Background Color (26+) "ongoing tasks which are critical for a

    user to see at a glance" builder.setColor()
  17. Progressbar

  18. Be Useful

  19. Actions (19+) notificationBuilder.addAction() Be Useful

  20. Direct reply (24+) Notification.Action.addRemoteInput() Be Useful

  21. None
  22. Be Useful → Don’t be unuseful

  23. TimeOut (26+) Be Useful setTimeoutAfter()

  24. Snoozing Be Useful

  25. Snoozing (26+) Be Useful

  26. Use NotificationListenerService Be Useful developer.android.com/reference/android/service/notification/NotificationListenerService.html

  27. ...Things got messy

  28. 40% opt out 70% reason for uninstall

  29. Be Focused

  30. Bundling (24+) Builder.setGroup() Be focused

  31. It wasn’t enough...

  32. Users wanted more control

  33. Channels (26+) Must! Notification.Builder() / setChannelId() Be focused

  34. The Power To The Users! • Sound • Lights •

    Vibration • Importance • Show on lockscreen • Override do not disturb
  35. NotificationChannel channel = new NotificationChannel(id, name, importance); channel.setDescription(description); // ...

    notificationManager .createNotificationChannel(channel);
  36. Grouping (26+) Manage channel per account (group) Be focused

  37. notificationManager. createNotificationChannelGroup( new NotificationChannelGroup(id, name));

  38. Notification Dot / Badge (26+) Be focused

  39. • channel.setShowBadge() • notificationBuilder.setNumber(); Notification Dot / Badge (26+) Be

    focused
  40. Launcher Icon

  41. Adaptive Icons (26+) Be pretty

  42. Background 108 dp = 72 + 18 + 18 dp

    Must be opaque
  43. Foreground 108 dp = 72 + 18 + 18 dp

    Can have transparency
  44. Mask Provided by the OEM

  45. Visible icon for the user (72dp) (48dp)

  46. Visible icon for the user (72dp) (48dp)

  47. Visible icon for the user (72dp) (48dp)

  48. Visible icon for the user (72dp) (48dp)

  49. There’s no second chance for first impression

  50. 29% close the app immediately if can’t find what they’re

    looking for
  51. Be Quick

  52. App Shortcuts (25+) Be Quick

  53. Static Shortcuts

  54. Static Shortcuts

  55. A Shortcut Has (mainly) 1. Icon 2. Label 3. Intent

  56. AndroidManifest.xml <activity ...> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /> Static Shortcuts

  57. shortcuts.xml <shortcut android:shortcutId="..." android:icon="..." android:shortcutShortLabel="..."> <intent ... /> <!-- more

    intents... --> <categories android:name="android.shortcut.conversation" /> </shortcut> Static Shortcuts
  58. Dynamic Shortcuts

  59. shortcutManager. setDynamicShortcuts(Arrays.asList(shortcut)); ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ShortcutInfo shortcut = new

    ShortcutInfo.Builder(this, MY_ID) //... .build(); Dynamic Shortcuts
  60. None
  61. Pinned Shortcuts (26+) Be Quick

  62. Pinned Shortcuts (26+)

  63. Pinned Shortcuts if (shortcutManager.isRequestPinShortcutSupported()) { }

  64. Pinned Shortcuts if (shortcutManager.isRequestPinShortcutSupported()) { Intent pinIntent = shortcutManager.createShortcutResultIntent(shortcutInfo); PendingIntent

    onPinnedIntent = PendingIntent.getBroadcast(context, 0, pinIntent, 0); }
  65. Pinned Shortcuts if (shortcutManager.isRequestPinShortcutSupported()) { Intent pinIntent = shortcutManager.createShortcutResultIntent(shortcutInfo); PendingIntent

    onPinnedIntent = PendingIntent.getBroadcast(context, 0, pinIntent, 0); shortcutManager. requestPinShortcut(shortcutInfo, onPinnedIntent.getIntentSender()); }
  66. Shortcuts Discovery • Onboarding • When user perform the action

  67. Can I do something even quicker?

  68. Be Quick 3. Quick Settings Tile (25+)

  69. Weather Quick Settings Tile Florian Möhle

  70. • STATE_ACTIVE • STATE_INACTIVE • STATE_UNAVAILABLE Tile States

  71. MyTileService extends TileService { } MyTileService.java

  72. • onTileAdded() • onStartListening() • onClick() • onStopListening() • onTileRemoved()

    Tile Lifecycle → on the Main Thread.
  73. @Override public void onStartListening() { Tile tile = getQsTile(); }

    MyTileService.java
  74. @Override public void onStartListening() { Tile tile = getQsTile(); //...

    tile.setState(Tile.STATE_ACTIVE); tile.updateTile(); } MyTileService.java
  75. <service ... android:permission= "android.permission.BIND_QUICK_SETTINGS_TILE"> <intent-filter> <action android:name= "android.service.quicksettings.action.QS_TILE"/> </intent-filter> </service>

    AndroidManifest.xml
  76. Show Dialog showDialog(intent);

  77. Start Activity startActivityAndCollapse(intent);

  78. Todoist

  79. None
  80. Users must love you on background as much as they

    do on the foreground
  81. Users must love u on the background... - Be relevant

    - Notifications styles - Be useful - Notification actions & reply - Be focused - Channels - Notif. badge - Be pretty - Adaptive icons - Be quick - Shortcuts - Quick settings tile
  82. Thank you! Britt Barak @brittBarak