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
150
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
54
Instant Apps Eulogy
oldergod
1
45
36・15 Cash App
oldergod
1
270
Heuristics in Everyday Life
oldergod
1
53
Sweet Architecture
oldergod
1
480
Architecture at Scale (droidconNYC 2022)
oldergod
2
710
Managing gRPC with Wire
oldergod
2
650
Wire & Proto3
oldergod
0
130
Effective Reactive Architecture
oldergod
2
250
Other Decks in Programming
See All in Programming
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
250
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
160
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
220
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
280
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.2k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
330
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
380
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
1
140
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
820
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
340
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Amusing Abliteration
ianozsvald
1
220
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
550
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Building Adaptive Systems
keathley
44
3.1k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
210
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