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

Activities in the Wild: Exploring the Activity Lifecycle (360|AnDev, July 2016)

Activities in the Wild: Exploring the Activity Lifecycle (360|AnDev, July 2016)

[Check out the video of this presentation from 360AnDev 2016: https://realm.io/news/activities-in-the-wild-exploring-the-activity-lifecycle-android/]

Running, or paused, or stopped, or destroyed? Oh my! As Android developers we have little control over what state our activities are in. But we do have the ability to hook into transitions between these states to respond appropriately and ensure a pleasant user experience.

Through concrete examples you will learn how the creation and destruction of your activity instances relate to what the user is doing, as well as to what the system is doing. We will explore how state is persisted (or not) in these various scenarios and also explore some little known facts about what happens to your activity in low memory situations.

Finally, we will discuss how knowing when these transitions happen has helped me deal with tricky situations, like continuing video playback while the user interacts with a full-screen overlay.

Kristin Marsicano

July 28, 2016
Tweet

More Decks by Kristin Marsicano

Other Decks in Programming

Transcript

  1. Activities in the Wild
    Exploring the Activity Lifecycle
    Kristin Marsicano @kristinmars Big Nerd Ranch

    View Slide

  2. Expectation setting
    Hello, World!

    View Slide

  3. Demo: Ticker Tally
    Photo Credit: https://www.amazon.com/GOGO-Counter-Carnival-Manual-Mechanical/dp/B001KX1VW2

    View Slide

  4. Goal for Today
    Empower you to reason about the Activity lifecycle
    so you can provide a smooth user experience

    View Slide

  5. What is the Activity
    Lifecycle?

    View Slide

  6. Activity
    public class TickerActivity extends AppCompatActivity {
    private int mCount = 0;

    ...

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_ticker);

    setupUI();

    updateUI();

    }


    ...
    }

    TickerActivity.java:










    activity_ticker.xml:

    View Slide

  7. Activity Manager

    View Slide

  8. Activity Manager
    User clicks
    Ticker icon on
    Launch Screen

    View Slide

  9. Activity Manager
    User clicks
    Ticker icon on
    Launch Screen

    View Slide

  10. Activity Manager
    User clicks
    Ticker icon on
    Launch Screen
    Intent:
    TickerActivity

    View Slide

  11. Activity Manager
    Activity
    Manager
    User clicks
    Ticker icon on
    Launch Screen
    Intent:
    TickerActivity

    View Slide

  12. Activity Manager
    Activity
    Manager
    User clicks
    Ticker icon on
    Launch Screen
    Intent:
    TickerActivity

    View Slide

  13. Activity Manager
    Activity
    Manager
    User clicks
    Ticker icon on
    Launch Screen
    Intent:
    TickerActivity
    Spin up app
    process

    View Slide

  14. Activity Manager
    Activity
    Manager
    User clicks
    Ticker icon on
    Launch Screen
    Intent:
    TickerActivity
    Spin up app
    process
    Create TickerActivity
    instance

    View Slide

  15. Activity Manager
    Activity
    Manager
    User clicks
    Ticker icon on
    Launch Screen
    Intent:
    TickerActivity
    Spin up app
    process
    Create TickerActivity
    instance
    Move TickerActivity
    to Running state

    View Slide

  16. Activity Manager
    Activity
    Manager
    User clicks
    Ticker icon on
    Launch Screen
    Intent:
    TickerActivity
    Spin up app
    process
    Create TickerActivity
    instance
    Move TickerActivity
    to Running state

    View Slide

  17. Android OS
    App Processes
    Launcher
    Contacts

    View Slide

  18. Android OS
    TerrificTicker
    App Processes
    Launcher
    Contacts

    View Slide

  19. Android OS
    TerrificTicker
    App Processes
    Launcher
    Contacts

    View Slide

  20. Android OS
    TerrificTicker
    One Foreground Activity
    Launcher
    Contacts
    Running
    Activity:
    What
    user
    sees

    View Slide

  21. Activity Lifecycle

    View Slide

  22. Activity Lifecycle
    Non-
    existent
    Stopped Paused Running
    Set of states Activity can be in

    View Slide

  23. Activity States

    View Slide

  24. Activity States
    State

    View Slide

  25. Activity States
    State In memory?

    View Slide

  26. Activity States
    State In memory? Visible to user?

    View Slide

  27. Activity States
    State In memory? Visible to user? In foreground?

    View Slide

  28. Activity States
    State In memory? Visible to user? In foreground?

    View Slide

  29. Activity States
    State In memory? Visible to user? In foreground?
    Non-Existent No No No

    View Slide

  30. Activity States
    State In memory? Visible to user? In foreground?
    Non-Existent No No No
    Stopped Yes No No

    View Slide

  31. Activity States
    State In memory? Visible to user? In foreground?
    Non-Existent No No No
    Stopped Yes No No
    Paused Yes Yes/Partially No

    View Slide

  32. Activity States
    State In memory? Visible to user? In foreground?
    Non-Existent No No No
    Stopped Yes No No
    Paused Yes Yes/Partially No
    Running
    (aka Resumed)
    Yes Yes Yes

    View Slide

  33. Activity in the Wild

    View Slide

  34. Activity Lifecycle

    View Slide

  35. Activity Lifecycle
    Non-
    existent
    Stopped Paused Running
    Set of states Activity can be in

    View Slide

  36. Activity Lifecycle
    Non-
    existent
    Stopped Paused Running
    Set of states Activity can be in
    Rules about when/how state changes

    View Slide

  37. Activity Lifecycle
    Non-
    existent
    Stopped Paused Running
    Set of states Activity can be in
    Rules about when/how state changes
    onDestroy()
    onCreate()
    onPause()
    onResume()
    onStart()
    onStop()
    Set of callback methods

    View Slide

  38. User Launches
    Activity
    Lifecycle by Example 1 of 5: “Build-up”

    View Slide

  39. Example: Launch
    TickerActivity

    View Slide

  40. Example: Launch
    TickerActivity
    Press Icon

    View Slide

  41. Example: Launch
    TickerActivity

    View Slide

  42. Laser Focus: Ticker Activity
    Android OS

    View Slide

  43. Start in Non-Existent State
    Non-
    existent
    Android OS

    View Slide

  44. User Launches App
    Non-
    existent
    Android OS
    User presses icon

    View Slide

  45. onCreate()
    Non-
    existent
    Android OS
    TerrificTicker
    Process
    Instance Created
    Ticker
    Activity
    mCount = 0
    Stopped
    Instance Created
    onCreate()

    View Slide

  46. Android OS
    onStart()
    Paused
    onStart()
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 0

    View Slide

  47. onResume()
    Running
    onResume()
    Paused
    onStart()
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 0

    View Slide

  48. Pressing Back
    Lifecycle by Example 2 of 5: “Tear down”

    View Slide

  49. User Increments Count
    Running
    onResume()
    Paused
    onStart()
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 0
    Press button

    View Slide

  50. User Increments Count
    Running
    onResume()
    Paused
    onStart()
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 0
    Press button
    Ticker
    Activity
    mCount = 1

    View Slide

  51. User Increments Count
    Running
    onResume()
    Paused
    onStart()
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 0
    Press button
    1
    Ticker
    Activity
    mCount = 1

    View Slide

  52. User Presses Back
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Paused Running
    onResume()
    onStart()
    Press Back
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 1
    1

    View Slide

  53. onPause()
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Paused Running
    User presses back
    onPause()
    onResume()
    onStart()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 1
    1

    View Slide

  54. onStop()
    onStop()
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Paused Running
    User presses back
    onPause()
    onResume()
    onStart()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 1

    View Slide

  55. onDestroy()
    onDestroy()
    Instance Destroyed
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Paused Running
    User presses back
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 1

    View Slide

  56. onDestroy()
    onDestroy()
    Instance Destroyed
    Non-
    existent
    Stopped
    Instance Created
    onCreate()
    Paused Running
    User presses back
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process

    View Slide

  57. User Launches App Again
    Android OS
    User presses icon
    TerrificTicker
    Process
    Non-
    existent

    View Slide

  58. User Launches App Again
    Android OS
    User presses icon
    TerrificTicker
    Process
    Non-
    existent
    What will the user see?
    0
    (0)
    1
    (1)

    View Slide

  59. Answer: (0)
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 0
    0
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onResume()
    onStart()

    View Slide

  60. Pressing Home
    Lifecycle Example 3 of 5: “Switching Tasks”

    View Slide

  61. Increment Count Twice

    View Slide

  62. Increment Count Twice
    Press home

    View Slide

  63. 1
    Increment Count Twice
    Press home

    View Slide

  64. 1
    Increment Count Twice
    2
    Press home

    View Slide

  65. Home Screen

    View Slide

  66. TickActivity is Running
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 2
    0
    2

    View Slide

  67. User Presses Home
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 2
    0
    2
    User presses
    Home

    View Slide

  68. onPause()
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    2
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 2

    View Slide

  69. onStop()
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 2

    View Slide

  70. User Launches App Again
    Android OS
    User presses icon
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 2
    Stopped

    View Slide

  71. User Launches App Again
    Android OS
    User presses icon
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 2
    Stopped
    What will the user see?
    0
    (0)
    2
    (2)

    View Slide

  72. Answer: (2)
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 2
    2

    View Slide

  73. Launching Another
    Activity
    Lifecycle Example 4 of 5: “Fully occlude TickerActivity”

    View Slide

  74. Launch TickerActivity
    Press Icon

    View Slide

  75. 0
    Increment Count
    Press three times

    View Slide

  76. 0
    1
    Increment Count
    Press three times

    View Slide

  77. 0
    1
    Increment Count
    2
    Press three times

    View Slide

  78. 0
    1
    Increment Count
    2
    Press three times
    3

    View Slide

  79. Launch SaveActivity
    Press Save Count

    View Slide

  80. SaveActivity is Running

    View Slide

  81. From the Start: TickerActivity
    is Running
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  82. Use Presses Save
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  83. SaveActivity Launches
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Save
    Activity

    View Slide

  84. TickerActivity: Stopped
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Save
    Activity

    View Slide

  85. User Presses Back
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Save
    Activity

    View Slide

  86. SaveActivity is Destroyed
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Save
    Activity

    View Slide

  87. SaveActivity is Destroyed
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  88. Ticker Activity Moves to
    Stopped from Running
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  89. onStart()
    onStart()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStop()

    View Slide

  90. onStart()
    onStart()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStop()

    View Slide

  91. onStart()
    onResume()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStop()

    View Slide

  92. Launching a
    Transparent Activity
    Lifecycle Example 5 of 5: “Partially occlude
    TickerActivity”

    View Slide

  93. Launch SaveActivity
    Press Save Count

    View Slide

  94. SaveActivity is Running

    View Slide

  95. From the Start: TickerActivity
    is Running
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  96. Use Presses Save
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  97. SaveActivity Launches
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Save
    Activity

    View Slide

  98. TickerActivity: Paused
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Save
    Activity

    View Slide

  99. User Presses Back
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Save
    Activity
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  100. User Presses Back
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  101. TickerActivity: Running
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  102. Lifecycle Summary
    Exists? Visible? Foreground?

    View Slide

  103. Activity Lifecycle
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  104. Entire Lifetime (Instance Lifetime)
    Instance Lifetime
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  105. Entire Lifetime
    Visible Lifetime
    Visible Lifetime
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  106. Entire Lifetime
    Foreground Lifetime
    Visible Lifetime
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Foreground Lifetime
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  107. Going Home,
    Revisited
    A Cautionary Tale

    View Slide

  108. Launch TickerActivity

    View Slide

  109. Do Lots of Work
    42

    View Slide

  110. Press Home
    42

    View Slide

  111. Launch Pokemon Go

    View Slide

  112. Play Pokemon GO

    View Slide

  113. Press Home

    View Slide

  114. Press Ticker Icon

    View Slide

  115. Launch Ticker

    View Slide

  116. Launch Ticker

    View Slide

  117. User Presses Home
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    User presses
    home
    3
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  118. onPause()
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    3
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  119. onStop()
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3

    View Slide

  120. User Plays Pokemon GO
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    Pokemon
    GO Process
    VideoActivity

    View Slide

  121. Uh oh…
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    VideoPlayer
    Process
    VideoActivity

    View Slide

  122. Ticker Process Gets Killed
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    X
    Android OS
    TerrificTicker
    Process
    Ticker
    Activity
    mCount = 3
    VideoPlayer
    Process
    VideoActivity
    X

    View Slide

  123. TickerActivity Jumps to Non-
    Existent
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()
    X
    Android OS
    VideoPlayer
    Process
    VideoActivity

    View Slide

  124. Saving Transient State
    onSaveInstanceState to the rescue

    View Slide

  125. onSaveInstanceState()
    public class TickerActivity extends AppCompatActivity {


    private static final String KEY_TICKER_COUNT = "ticker_count";

    ...


    @Override

    protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);

    outState.putInt(KEY_TICKER_COUNT, mCount);

    }
    ...

    }


    View Slide

  126. public class TickerActivity extends AppCompatActivity {


    ...

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_ticker);

    setupUI();


    if (savedInstanceState != null) {

    mCount = savedInstanceState.getInt(KEY_TICKER_COUNT, 0);

    }


    updateUI();

    }
    ...

    }

    Using State Bundle

    View Slide

  127. Activity Record Stored
    3
    Activity Record
    Store
    Instance A

    View Slide

  128. Activity Record Stored
    3
    Activity Record
    Store
    onSaveInstanceState
    ticker_count: 3
    Instance A

    View Slide

  129. Activity Record Stored
    3
    Activity Record
    Store
    onSaveInstanceState
    ticker_count: 3
    TerrificTicker Instance
    A Record
    ticker_count: 3
    Instance A

    View Slide

  130. Process Gets Killed
    Activity Record
    Store
    TerrificTicker Instance
    A Record
    ticker_count: 3

    View Slide

  131. User Launches App
    Activity Record
    Store
    TerrificTicker Instance
    A Record
    ticker_count: 3

    View Slide

  132. User Launches App
    Activity Record
    Store
    TerrificTicker Instance
    A Record
    ticker_count: 3
    onCreate
    ticker_count: 3

    View Slide

  133. User Launches App
    Activity Record
    Store
    TerrificTicker Instance
    A Record
    ticker_count: 3
    3
    Recreated
    Instance A
    onCreate
    ticker_count: 3

    View Slide

  134. User Launches App
    Activity Record
    Store
    3
    Recreated
    Instance A
    onCreate
    ticker_count: 3

    View Slide

  135. User Launches App
    Activity Record
    Store
    3
    Recreated
    Instance A

    View Slide

  136. Full Circle

    View Slide

  137. Structuring your
    Activity
    What to put in each callback?

    View Slide

  138. onCreate
    • call setContentView()
    • “hook up” UI widgets
    • check for saved state bundle

    View Slide

  139. onPause
    • save vital data
    • typically stop animations or other things consuming
    CPU
    • should be quick

    View Slide

  140. onStop
    • persist vital data
    • last guaranteed teardown method

    View Slide

  141. onDestroy
    • last place to free resources
    • not guaranteed to be called

    View Slide

  142. But Also…
    • It depends!

    View Slide

  143. Reasoning About the
    Lifecycle
    What to put in each callback?

    View Slide

  144. Displaying Location
    • Show user their location
    • Minimize battery usage
    • Maximize precision when user is actively looking at
    my map

    View Slide

  145. Displaying Location: Which
    Callbacks?
    • Start sampling - onStart
    • Set higher sampling rate/accuracy - onResume
    • Set lower sampling rate/accuracy - onPause
    • Stop sampling - onStop
    onDestroy()
    Non-
    existent
    Stopped
    onCreate()
    Paused Running
    onPause()
    onResume()
    onStart()
    onStop()

    View Slide

  146. Video Playback

    View Slide

  147. Video Playback
    • User starts video activity
    • User presses a transparent settings activity
    • video should keep playing!

    View Slide

  148. Video Playback: Which
    Callbacks?
    • initialize player - onCreate
    • start playback - onStart
    • stop playback - onStop
    • release player resources - onDestroy

    View Slide

  149. Capstone Challenge
    What state are these activities in?

    View Slide

  150. Challenge: Multi-Window
    What state is each in?

    View Slide

  151. Next Steps

    View Slide

  152. @kristinmars
    github.com/kristinmars
    bignerdranch.com

    View Slide