Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Activity LifeCycle入門
Benoît Quenaudon
November 01, 2016
Programming
0
62
Activity LifeCycle入門
Benoît Quenaudon
November 01, 2016
Tweet
Share
More Decks by Benoît Quenaudon
See All by Benoît Quenaudon
oldergod
0
9
oldergod
2
120
oldergod
0
420
oldergod
2
350
oldergod
1
70
oldergod
2
120
oldergod
17
8.6k
oldergod
2
780
oldergod
24
4.8k
Other Decks in Programming
See All in Programming
shiba6v
0
200
manfredsteyer
PRO
1
110
chimerast
0
340
sysrich
0
250
toedter
0
130
gtongy
0
470
bkuhlmann
4
300
timeseriesfr
0
120
seike460
8
2.2k
orgachem
1
220
samjulien
0
390
oracle4engineer
0
110
Featured
See All Featured
colly
188
14k
jrom
116
7.2k
denniskardys
220
120k
lauravandoore
11
1.7k
skipperchong
8
790
mthomps
38
2.3k
tanoku
86
8.6k
smashingmag
283
47k
philhawksworth
192
17k
bkeepers
PRO
54
4.3k
swwweet
206
6.9k
destraynor
221
47k
Transcript
Android Lifecycle 入門勉強会 ケノドン ブノア @oldergod
本日のゴール 1. アクティビティライフサイクルの事を考慮 できる事 2. ユーザにより快適なUXを提供できる事
アクティビティのライフサイクルとは?
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>
Activity Manager Activity Manager Intent: TickerActivity 専用プロセス作成 Activity インスタンス 作成
TickerActivity をランニン グステートへ
App Processes Android OS Home Activity Timeline Activity Ticker Activity
Always Only 1 Foreground Activity Android OS Home Activity Timeline
Activity Ticker Activity
Activity State ステート
Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド
Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕
✕
Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕
✕ ストップ ◎ ✕ ✕
Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕
✕ ストップ ◎ ✕ ✕ ポーズ ◎ ◎ 一部デモ ✕
Activity State ステート メモリにある ? ユーザが見える? フォアグラウンド 不存在 ✕ ✕
✕ ストップ ◎ ✕ ✕ ポーズ ◎ ◎ 一部デモ ✕ ランニング (レジューム) ◎ ◎ ◎
Activity in the Wild
Activity Lifecycle: Callbacks 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume()
onStop() onPause() onDestroy()
⅕ ユーザがアクティビティを起動する
アクティビティを起動 不存在 Android OS クリック
アクティビティを起動 不存在 ストップ onCreate() Android OS Tickerプロセス Ticker アクティビティ count
= 0
アクティビティを起動 不存在 ストップ ポーズ onCreate() onStart() Android OS Tickerプロセス Ticker
アクティビティ count = 0
アクティビティを起動 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() Android OS
Tickerプロセス Ticker アクティビティ count = 0
アクティビティを起動 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() Android OS
Tickerプロセス Ticker アクティビティ count = 1 クリック
⅖ ユーザがバックボタンを押す
バックボタン 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 1 ク リ ッ ク
バックボタン 不存在 ストップ ポーズ ランニング onPause() Android OS Tickerプロセス Ticker
アクティビティ count = 1
バックボタン 不存在 ストップ ポーズ ランニング onStop() onPause() Android OS Tickerプロセス
Ticker アクティビティ count = 1
バックボタン 不存在 ストップ ポーズ ランニング onStop() onPause() onDestroy() Android OS
Tickerプロセス
もう一度アクティビティを起動 不存在 Android OS Tickerプロセス クリック
ユーザはどの画面を見える? 不存在 Android OS Tickerプロセス 0 対 1
ユーザはどの画面を見える? 不存在 Android OS Tickerプロセス 0 対 1
もう一度アクティビティを起動 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() Android OS
Tickerプロセス Ticker アクティビティ count = 0
⅗ ユーザがホームボタンを押す
ホームボタン 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 1 ク リ ッ ク
ホームボタン 不存在 ストップ ポーズ ランニング onPause() Android OS Tickerプロセス Ticker
アクティビティ count = 1
ホームボタン 不存在 ストップ ポーズ ランニング onStop() onPause() Android OS Tickerプロセス
Ticker アクティビティ count = 1
もう一度アクティビティを起動 Android OS Tickerプロセス クリック Ticker アクティビティ count = 1
ストップ
ストップ ユーザはどの画面を見える? Android OS Tickerプロセス 0 対 1 Ticker アクティビティ
count = 1
ストップ ユーザはどの画面を見える? Android OS Tickerプロセス 0 対 1 Ticker アクティビティ
count = 1
もう一度アクティビティを起動 不存在 ストップ ポーズ ランニング onStart() onResume() Android OS Tickerプロセス
Ticker アクティビティ count = 1
⅘ 違うアクティビティを起動
保存アクティビティを起動 クリック 移動
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 クリック
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 onPause()
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS onPause() onStop() Tickerプロセス
Ticker アクティビティ count = 3 Save アクティビティ
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 Save アクティビティ
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 Save アクティビティ ク リ ッ ク
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 onStart()
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 onStart() onResume()
5/5 透明なアクティビティを起動
保存アクティビティを起動 移動 クリック
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 クリック
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 onPause()
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 Transparent アクティビティ
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3 Transparent アクティビティ ク リ ッ ク
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 3
違うアクティビティを起動 不存在 ストップ ポーズ ランニング Android OS onResume() Tickerプロセス Ticker
アクティビティ count = 3
ライフサイクルまとめ
Activity Lifecycle 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume() onStop()
onPause() onDestroy()
インスタンスラインタイム Instance Lifecycle 不存在 ストップ ポーズ ランニング onCreate() onStart() onResume()
onStop() onPause() onDestroy()
インスタンスラインタイム 表示ライフサイクル Visible Lifecycle 不存在 ストップ ポーズ ランニング onCreate() onStart()
onResume() onStop() onPause() onDestroy()
インスタンスラインタイム 表示ライフサイクル フォアグラウンド ライフサイクル Foreground Lifecycle 不存在 ストップ ポーズ ランニング
onCreate() onStart() onResume() onStop() onPause() onDestroy()
別アプリを起動する罠
Tickerアプリで起動 クリック
Tickerアプリで色々する
ホームボタンを クリック
ねじ巻きナイトを起動 クリック
満足してホームボタンを
Tickerアプリで起動 クリック
クリック数がちゃんっ!なにー!? クリック数がちゃんと34になっている!
説明:ホームボタンを 不存在 ストップ ポーズ ランニング Android OS Tickerプロセス Ticker アクティビティ
count = 34 ク リ ッ ク
ホームボタン 不存在 ストップ ポーズ ランニング onPause() Android OS Tickerプロセス Ticker
アクティビティ count = 34
ホームボタン 不存在 ストップ ポーズ ランニング onStop() onPause() Android OS Tickerプロセス
Ticker アクティビティ count = 34
ねじ巻きナイトを起動 Android OS Tickerプロセス クリック Ticker アクティビティ count = 34
ストップ
いっぱい遊ぶ Android OS Tickerプロセス Ticker アクティビティ count = 34 ストップ
ねじ巻きナイト プロセス
その間、メモリをガツガツ食う
いっぱいアソーっブ Android OS Tickerプロセス Ticker アクティビティ count = 34 ストップ
ねじ巻きナイト プロセス 不存在 onDestroy()
Saving Transient State
onSaveInstanceState • アクティビティが KILL されるかもの前に呼ばれるか ものコールバック • 呼ばれたり、呼ばなかったり、OSの気まぐれ • 通常の流れじゃ呼ばれない!
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()); } }
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) ); } } }
By the way... ?
Config Changes • 言葉、フォントサイズ、ネットワーク、キーボード、 等 ◦ https://developer.android.com/guide/topics/manifest/ac tivity-element.html#config
コードの整理アドバイス
onCreate() • setContentView() • UIウィジェットのバインディング • 保存された state bundle を確認
• データの読込
onStart() • データの更新 • 止まっていた処理の再開
onResume() • 普段は何もしないかな。
onPause() • クリティカル情報の保存 • CPU食うやつ止める • すぐ終わる処理を実行する
onStop() • クリティカル情報の保管 • 確保された最後のTeardownコールバック
onDestroy() • まだのリソースを解消 • 呼ばれない可能性あり
ベストプラクティス • 開発最中は Don’t Keep Activities を有効
Quiz:各アクティビティのステート?
ケノドン ブノア @oldergod Fin
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