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
65
Instant Apps Eulogy
oldergod
1
66
36・15 Cash App
oldergod
1
290
Heuristics in Everyday Life
oldergod
1
63
Sweet Architecture
oldergod
1
500
Architecture at Scale (droidconNYC 2022)
oldergod
2
740
Managing gRPC with Wire
oldergod
2
680
Wire & Proto3
oldergod
0
150
Effective Reactive Architecture
oldergod
2
270
Other Decks in Programming
See All in Programming
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
280
phperだってパンチカードでコーディングしたい
o0h
PRO
0
330
sbt 2.0: takeoff
eed3si9n
0
160
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
420
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
150
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.6k
エンジニアに許された特別な時間の終わり
watany
109
250k
Designing for Performance
lara
612
70k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Automating Front-end Workflow
addyosmani
1369
210k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Google's AI Overviews - The New Search
badams
0
1.6k
BBQ
matthewcrist
90
10k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Technical Leadership for Architectural Decision Making
baasie
3
600
Un-Boring Meetings
codingconduct
0
450
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