Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
59
Instant Apps Eulogy
oldergod
1
54
36・15 Cash App
oldergod
1
280
Heuristics in Everyday Life
oldergod
1
60
Sweet Architecture
oldergod
1
490
Architecture at Scale (droidconNYC 2022)
oldergod
2
730
Managing gRPC with Wire
oldergod
2
670
Wire & Proto3
oldergod
0
140
Effective Reactive Architecture
oldergod
2
260
Other Decks in Programming
See All in Programming
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
1
150
FreeBSDでZabbixを動かす
kenkino
0
290
Intent as Code
shoppingjaws
6
1k
アクセシビリティから考える情報設計
high_g_engineer
0
380
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
310
iOSDC2026登壇資料.pdf
riofujimon
0
160
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
550
Jetpack Compose メカニズム
skydoves
0
430
新卒PdEのリアル
ryu1013
1
500
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
150
スマート反転とウェブアクセシビリティ
camiha
0
210
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1k
Featured
See All Featured
Designing Powerful Visuals for Engaging Learning
tmiket
1
550
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
The SEO identity crisis: Don't let AI make you average
varn
0
560
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
Chasing Engaging Ingredients in Design
codingconduct
0
310
Un-Boring Meetings
codingconduct
0
420
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Building Applications with DynamoDB
mza
96
7.2k
Optimising Largest Contentful Paint
csswizardry
37
4k
The untapped power of vector embeddings
frankvandijk
2
1.9k
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