Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Activity LifeCycle入門
Search
Benoît Quenaudon
November 01, 2016
Programming
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Activity LifeCycle入門
Benoît Quenaudon
November 01, 2016
More Decks by Benoît Quenaudon
See All by Benoît Quenaudon
36・15 Cash App
oldergod
1
56
Instant Apps Eulogy
oldergod
1
53
36・15 Cash App
oldergod
1
270
Heuristics in Everyday Life
oldergod
1
59
Sweet Architecture
oldergod
1
490
Architecture at Scale (droidconNYC 2022)
oldergod
2
720
Managing gRPC with Wire
oldergod
2
660
Wire & Proto3
oldergod
0
140
Effective Reactive Architecture
oldergod
2
260
Other Decks in Programming
See All in Programming
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.8k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
970
VibeCodingからAgenticWorkflowへ
starfish719
0
670
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.9k
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
430
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
5
1.9k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
520
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.9k
プロポーザルを書いてもらう
pvcresin
0
560
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
430
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
210
Google Apps Script で Ruby を動かす
kawahara
0
280
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.7k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
420
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
390
Everyday Curiosity
cassininazir
0
290
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
500
Leo the Paperboy
mayatellez
8
2.2k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
250
エンジニアに許された特別な時間の終わり
watany
108
250k
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