Activity LifeCycle入門

Activity LifeCycle入門

05162bc961c3654218bf1839974a4f35?s=128

Benoît Quenaudon

November 01, 2016
Tweet

Transcript

  1. Android Lifecycle 入門勉強会 ケノドン ブノア @oldergod

  2. 本日のゴール 1. アクティビティライフサイクルの事を考慮 できる事 2. ユーザにより快適なUXを提供できる事

  3. アクティビティのライフサイクルとは?

  4. Activity とは? TickerActivity.java public class TickerActivity extends AppCompatActivity { private

    Counter counter;   @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); counter = new Counter(); /* ... */ }   public void buttonClicked(View view) { counter.incrementeByOne(); } } activity_ticker.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout>   <TextView />   <TextView />   <Button /> </android.support.constraint.ConstraintLayout>
  5. Activity Manager Activity Manager Intent: TickerActivity 専用プロセス作成 Activity インスタンス 作成

    TickerActivity をランニン グステートへ
  6. App Processes Android OS Home Activity Timeline Activity Ticker Activity

  7. Always Only 1 Foreground Activity Android OS Home Activity Timeline

    Activity Ticker Activity
  8. Activity State ステート

  9. Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド

  10. Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕

  11. Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕

    ✕ ストップ ◎ ✕ ✕
  12. Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕

    ✕ ストップ ◎ ✕ ✕ ポーズ ◎ ◎ 一部デモ ✕
  13. Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕

    ✕ ストップ ◎ ✕ ✕ ポーズ ◎ ◎ 一部デモ ✕ ランニング (レジューム) ◎ ◎ ◎
  14. Activity in the Wild

  15. Activity Lifecycle: Callbacks 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume()

    onStop() onPause() onDestroy()
  16. ⅕ ユーザがアクティビティを起動する

  17. アクティビティを起動 不存在 Android OS クリック

  18. アクティビティを起動 不存在 ストップ onCreate() Android OS Tickerプロセス Ticker アクティビティ count

    = 0
  19. アクティビティを起動 不存在 ストップ ポーズ onCreate() onStart() Android OS Tickerプロセス Ticker

    アクティビティ count = 0
  20. アクティビティを起動 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() Android OS

    Tickerプロセス Ticker アクティビティ count = 0
  21. アクティビティを起動 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() Android OS

    Tickerプロセス Ticker アクティビティ count = 1 クリック
  22. ⅖ ユーザがバックボタンを押す

  23. バックボタン 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 1 ク リ ッ ク
  24. バックボタン 不存在 ストップ ポーズ ランニング onPause() Android OS Tickerプロセス Ticker

    アクティビティ count = 1
  25. バックボタン 不存在 ストップ ポーズ ランニング onStop() onPause() Android OS Tickerプロセス

    Ticker アクティビティ count = 1
  26. バックボタン 不存在 ストップ ポーズ ランニング onStop() onPause() onDestroy() Android OS

    Tickerプロセス
  27. もう一度アクティビティを起動 不存在 Android OS Tickerプロセス クリック

  28. ユーザはどの画面を見える? 不存在 Android OS Tickerプロセス 0 対 1

  29. ユーザはどの画面を見える? 不存在 Android OS Tickerプロセス 0 対 1

  30. もう一度アクティビティを起動 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() Android OS

    Tickerプロセス Ticker アクティビティ count = 0
  31. ⅗ ユーザがホームボタンを押す

  32. ホームボタン 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 1 ク リ ッ ク
  33. ホームボタン 不存在 ストップ ポーズ ランニング onPause() Android OS Tickerプロセス Ticker

    アクティビティ count = 1
  34. ホームボタン 不存在 ストップ ポーズ ランニング onStop() onPause() Android OS Tickerプロセス

    Ticker アクティビティ count = 1
  35. もう一度アクティビティを起動 Android OS Tickerプロセス クリック Ticker アクティビティ count = 1

    ストップ
  36. ストップ ユーザはどの画面を見える? Android OS Tickerプロセス 0 対 1 Ticker アクティビティ

    count = 1
  37. ストップ ユーザはどの画面を見える? Android OS Tickerプロセス 0 対 1 Ticker アクティビティ

    count = 1
  38. もう一度アクティビティを起動 不存在 ストップ ポーズ ランニング onStart() onResume() Android OS Tickerプロセス

    Ticker アクティビティ count = 1
  39. ⅘ 違うアクティビティを起動

  40. 保存アクティビティを起動 クリック 移動

  41. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 クリック
  42. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 onPause()
  43. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS onPause() onStop() Tickerプロセス

    Ticker アクティビティ count = 3 Save アクティビティ
  44. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 Save アクティビティ
  45. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 Save アクティビティ ク リ ッ ク
  46. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3
  47. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 onStart()
  48. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 onStart() onResume()
  49. 5/5 透明なアクティビティを起動

  50. 保存アクティビティを起動 移動 クリック

  51. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 クリック
  52. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 onPause()
  53. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 Transparent アクティビティ
  54. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3 Transparent アクティビティ ク リ ッ ク
  55. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 3
  56. 違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS onResume() Tickerプロセス Ticker

    アクティビティ count = 3
  57. ライフサイクルまとめ

  58. Activity Lifecycle 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() onStop()

    onPause() onDestroy()
  59. インスタンスラインタイム Instance Lifecycle 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume()

    onStop() onPause() onDestroy()
  60. インスタンスラインタイム 表示ライフサイクル Visible Lifecycle 不存在 ストップ ポーズ ランニング onCreate() onStart()

    onResume() onStop() onPause() onDestroy()
  61. インスタンスラインタイム 表示ライフサイクル フォアグラウンド ライフサイクル Foreground Lifecycle 不存在 ストップ ポーズ ランニング

    onCreate() onStart() onResume() onStop() onPause() onDestroy()
  62. 別アプリを起動する罠

  63. Tickerアプリで起動 クリック

  64. Tickerアプリで色々する

  65. ホームボタンを クリック

  66. ねじ巻きナイトを起動 クリック

  67. 満足してホームボタンを

  68. Tickerアプリで起動 クリック

  69. クリック数がちゃんっ!なにー!? クリック数がちゃんと34になっている!

  70. 説明:ホームボタンを 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ

    count = 34 ク リ ッ ク
  71. ホームボタン 不存在 ストップ ポーズ ランニング onPause() Android OS Tickerプロセス Ticker

    アクティビティ count = 34
  72. ホームボタン 不存在 ストップ ポーズ ランニング onStop() onPause() Android OS Tickerプロセス

    Ticker アクティビティ count = 34
  73. ねじ巻きナイトを起動 Android OS Tickerプロセス クリック Ticker アクティビティ count = 34

    ストップ
  74. いっぱい遊ぶ Android OS Tickerプロセス Ticker アクティビティ count = 34 ストップ

    ねじ巻きナイト プロセス
  75. その間、メモリをガツガツ食う

  76. いっぱいアソーっブ Android OS Tickerプロセス Ticker アクティビティ count = 34 ストップ

    ねじ巻きナイト プロセス 不存在 onDestroy()
  77. Saving Transient State

  78. onSaveInstanceState • アクティビティが KILL されるかもの前に呼ばれるか ものコールバック • 呼ばれたり、呼ばなかったり、OSの気まぐれ • 通常の流れじゃ呼ばれない!

  79. onSaveInstanceState public class TickerActivity extends AppCompatActivity { private static final

    String COUNTER_KEY = "COUNTER_KEY"; // 略 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(COUNTER_KEY, counter.getCount()); } }
  80. Using State Bundle public class TickerActivity extends AppCompatActivity { @Override

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { counter = new Counter(); } else { counter = new Counter( savedInstanceState.getInt(COUNTER_KEY, 0) ); } } }
  81. By the way... ?

  82. Config Changes • 言葉、フォントサイズ、ネットワーク、キーボード、 等 ◦ https://developer.android.com/guide/topics/manifest/ac tivity-element.html#config

  83. コードの整理アドバイス

  84. onCreate() • setContentView() • UIウィジェットのバインディング • 保存された state bundle を確認

    • データの読込
  85. onStart() • データの更新 • 止まっていた処理の再開

  86. onResume() • 普段は何もしないかな。

  87. onPause() • クリティカル情報の保存 • CPU食うやつ止める • すぐ終わる処理を実行する

  88. onStop() • クリティカル情報の保管 • 確保された最後のTeardownコールバック

  89. onDestroy() • まだのリソースを解消 • 呼ばれない可能性あり

  90. ベストプラクティス • 開発最中は Don’t Keep Activities を有効

  91. Quiz:各アクティビティのステート?

  92. ケノドン ブノア @oldergod Fin

  93. Reference • Activities in the Wild ◦ https://goo.gl/EL0uW9 • Deep

    Dive Into State Restoration ◦ https://goo.gl/kAIpBD • onSaveInstanceState ◦ https://goo.gl/q0nF8X • Managing the Activity Lifecycle ◦ https://goo.gl/Gt7pIy