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

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

Britt Barak
October 27, 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

Britt Barak

October 27, 2017
Tweet

More Decks by Britt Barak

Other Decks in Technology

Transcript

  1. When your
    app’s asleep
    Britt Barak

    View full-size slide

  2. Avg ~2 minutes/day

    View full-size slide

  3. OR
    23 hours and 58 minutes
    unuse

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. Let’s begin!

    View full-size slide

  7. Notification

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. Media (21+)
    setStyle()

    View full-size slide

  13. Background Color (26+)
    "ongoing tasks which are critical for a user to see at a glance"
    builder.setColor()

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  16. Be Useful →
    Don’t be unuseful

    View full-size slide

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

    View full-size slide

  18. Snoozing
    Be Useful

    View full-size slide

  19. Snoozing (26+)
    Be Useful

    View full-size slide

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

    View full-size slide

  21. ...Things got messy

    View full-size slide

  22. 40% opt out
    70% reason for uninstall

    View full-size slide

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

    View full-size slide

  24. It wasn’t enough...

    View full-size slide

  25. Users wanted more control

    View full-size slide

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

    View full-size slide

  27. The Power To The Users!
    ● Sound
    ● Lights
    ● Vibration
    ● Importance
    ● Show on lockscreen
    ● Override do not disturb

    View full-size slide

  28. NotificationChannel channel =
    new NotificationChannel(id, name, importance);
    channel.setDescription(description);
    // ...
    notificationManager
    .createNotificationChannel(channel);

    View full-size slide

  29. Grouping (26+)
    Manage channel per account (group)
    Be focused

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. ● channel.setShowBadge()
    ● notificationBuilder.setNumber();
    Notification Dot / Badge (26+)
    Be focused

    View full-size slide

  33. Launcher Icon

    View full-size slide

  34. Adaptive Icons
    (26+)
    Be pretty

    View full-size slide

  35. Background
    108 dp =
    72 + 18 + 18 dp
    Must be opaque

    View full-size slide

  36. Foreground
    108 dp =
    72 + 18 + 18 dp
    Can have transparency

    View full-size slide

  37. Mask
    Provided by the OEM

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  42. There’s no second chance
    for first impression

    View full-size slide

  43. 29%
    close the app immediately
    if can’t find what they’re looking for

    View full-size slide

  44. App Shortcuts
    (25+)
    Be Quick

    View full-size slide

  45. Static Shortcuts

    View full-size slide

  46. Static Shortcuts

    View full-size slide

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

    View full-size slide

  48. AndroidManifest.xml

    android:resource="@xml/shortcuts" />
    Static Shortcuts

    View full-size slide

  49. shortcuts.xml
    android:shortcutId="..."
    android:icon="..."
    android:shortcutShortLabel="...">




    Static Shortcuts

    View full-size slide

  50. Dynamic Shortcuts

    View full-size slide

  51. shortcutManager.
    setDynamicShortcuts(Arrays.asList(shortcut));
    ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
    ShortcutInfo shortcut = new ShortcutInfo.Builder(this, MY_ID)
    //...
    .build();
    Dynamic Shortcuts

    View full-size slide

  52. Pinned Shortcuts
    (26+)
    Be Quick

    View full-size slide

  53. Pinned Shortcuts (26+)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  57. Shortcuts Discovery
    ● Onboarding
    ● When user perform the action

    View full-size slide

  58. Can I do something even quicker?

    View full-size slide

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

    View full-size slide

  60. Weather Quick Settings Tile Florian Möhle

    View full-size slide

  61. ● STATE_ACTIVE
    ● STATE_INACTIVE
    ● STATE_UNAVAILABLE
    Tile States

    View full-size slide

  62. MyTileService extends TileService {
    }
    MyTileService.java

    View full-size slide


  63. onTileAdded()

    onStartListening()

    onClick()

    onStopListening()

    onTileRemoved()
    Tile Lifecycle
    → on the Main Thread.

    View full-size slide

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

    View full-size slide

  65. @Override
    public void onStartListening() {
    Tile tile = getQsTile();
    //...
    tile.setState(Tile.STATE_ACTIVE);
    tile.updateTile();
    }
    MyTileService.java

    View full-size slide

  66. android:permission=
    "android.permission.BIND_QUICK_SETTINGS_TILE">

    "android.service.quicksettings.action.QS_TILE"/>


    AndroidManifest.xml

    View full-size slide

  67. Show Dialog
    showDialog(intent);

    View full-size slide

  68. Start Activity
    startActivityAndCollapse(intent);

    View full-size slide

  69. Users must love you
    on background
    as much as they do
    on the foreground

    View full-size slide

  70. 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

    View full-size slide

  71. Thank you!
    Britt Barak
    @brittBarak

    View full-size slide