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
Android値受け渡し大全 〜 設計を制する者が「渡す」を制す 〜
Search
みっちゃん
September 11, 2025
0
230
Android値受け渡し大全 〜 設計を制する者が「渡す」を制す 〜
DroidKaigi 2025 の登壇資料
https://2025.droidkaigi.jp/timetable/940354/
みっちゃん
September 11, 2025
Tweet
Share
More Decks by みっちゃん
See All by みっちゃん
2024年にチャレンジしたことを振り返るぞ
mitchan
0
240
DroidKaigi初めて登壇したレポ
mitchan
1
170
実践!難読化ガイド
mitchan
0
3k
「実践!難読化ガイド」事前予告編
mitchan
0
280
画面遷移 〜iOSとAndroid〜
mitchan
0
230
パソコン音痴な私がモバイル開発界隈でぬくぬく成長している理由
mitchan
0
480
ドキュメントから adbコマンドの仕組みを読み解く
mitchan
1
320
2024年は難読化と仲良くなりたい
mitchan
0
380
STORES二年生が得た新しい視点
mitchan
0
300
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Code Reviewing Like a Champion
maltzj
525
40k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
RailsConf 2023
tenderlove
30
1.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Agile that works and the tools we love
rasmusluckow
330
21k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Balancing Empowerment & Direction
lara
3
620
Being A Developer After 40
akosma
90
590k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Transcript
Android値受け渡し大全 ~ 設計を制する者が「渡す」を制す 〜 登壇者:STORES 株式会社 Androidエンジニア みっちゃん 1
自己紹介 • 名前:みっちゃん • 経歴: ◦ 22新卒でSTORES 株式会社に入社 ◦ STORES
決済 や ブランドアプリ の開発 ◦ Android歴は4年目くらい ◦ DroidKaigiスタッフもしてます! X(Twitter): 🔗@mimimi_engineer 2/103
本セッションの目的 Androidアプリ開発において「この値、別のクラスでも参照したい!」 というシチュエーション、いっぱいありますよね?!?! 3/103
本セッションの目的 「値を渡したい」時に一番最初に思いつくのはなんでしょう? → メソッドの引数に渡す! どんなシチュエーションでもそれで乗り切れますか...? 4/103
本セッションの目的 例えば... ユーザーから入力された値を保存したいので、ViewModelのsave() メソッドに入力データを渡したい! → 「メソッドの引数に渡す」でそう! 5/103
本セッションの目的 例えば... ニュース詳細画面を開いてニュースが「既読」状態になったら、 ニュース一覧画面に戻った時も既読状態になっていてほしい = 「既読」の情報を2つの画面から参照したい! → 「引数に渡す」手段で本当に大丈夫?? 6/103
本セッションの目的 このように、値やデータを別のクラスでも参照したい!使いたい! というシチュエーションはたくさんあります! 1つの手段しか持っていないと、 保守性や可読性の観点からアプリに悪影響を与えていることにも気付けない! どんな手段があるのか・その手段はどういう観点で良い or 悪いのか、 というのが分かれば、その時の状況やプロダクトの性質に応じて 確信を持って最適な手段を選択することができる!
7/103
本日のゴール • 値の受け渡し方法について色々な手段があることを知っている • 「良い設計」や「Androidアプリ特有の性質」の観点から、それぞれ の方法の良し悪しを評価できる 8/103
本セッションの対象者 • ⭐ 初級〜中級者:新しい学びや、思考の整理になります • 上級者:改めて思考の整理になったり、後輩に教える時の材料にも なります 9/103
• 値を渡す色々な方法 • 値を渡すだけじゃダメ!「いいね問題」の解決方法どっちが良い? • 解決方法を評価するための観点2つ • 「いいね問題」の解決方法をもう一度評価してみよう • まとめ
• 参考文献 本日のお品書き 10/103
• 値を渡す色々な方法 • 値を渡すだけじゃダメ!「いいね問題」の解決方法どっちが良い? • 解決方法を評価するための観点2つ • 「いいね問題」の解決方法をもう一度評価してみよう • まとめ
• 参考文献 本日のお品書き 11/103
• 値を渡す色々な方法 1. メソッドの引数に渡す 2. 画面遷移時に渡す 3. Pub-Sub 4. DI
5. データホルダーを使って受け流す 本日のお品書き 12/103
• 値を渡す色々な方法 1. メソッドの引数に渡す 2. 画面遷移時に渡す 3. Pub-Sub 4. DI
5. データホルダーを使って受け流す 本日のお品書き 13/103
1. メソッドの引数に渡す • 最も基本的な方法 • 例:ユーザーの入力情報を更新するためにViewModelのメソッドに渡す 値を渡す色々な方法 14/103
• 値を渡す色々な方法 1. メソッドの引数に渡す 2. 画面遷移時に渡す 3. Pub-Sub 4. DI
5. データホルダーを使って受け流す 本日のお品書き 15/103
2. 画面遷移時に渡す • Activityベース ◦ Intent • Fragmentベース ◦ FragmentTransaction
/ NavigationComponent • Composeベース ◦ NavigationCompose 値を渡す色々な方法 17/103
2. 画面遷移時に渡す Activityベース:Intentを使う 値を渡す色々な方法 18/103
2. 画面遷移時に渡す Activityベース:Intentを使う 値を渡す色々な方法 19/103
2. 画面遷移時に渡す Activityベース:Intentを使う 値を渡す色々な方法 20/103
2. 画面遷移時に渡す Fragmentベース:FragmentTransaction, NavigationComponent 値を渡す色々な方法 21/103
2. 画面遷移時に渡す Fragmentベース:FragmentTransaction, NavigationComponent 値を渡す色々な方法 22/103
2. 画面遷移時に渡す Fragmentベース:FragmentTransaction, NavigationComponent 値を渡す色々な方法 23/103
2. 画面遷移時に渡す Fragmentベース:FragmentTransaction, NavigationComponent 値を渡す色々な方法 24/103
2. 画面遷移時に渡す Fragmentベース:FragmentTransaction, NavigationComponent 値を渡す色々な方法 nav_graph.xml Fragment 25/103
2. 画面遷移時に渡す Fragmentベース:FragmentTransaction, NavigationComponent 値を渡す色々な方法 nav_graph.xml Fragment 26/103
2. 画面遷移時に渡す Fragmentベース:FragmentTransaction, NavigationComponent 値を渡す色々な方法 nav_graph.xml Fragment 27/103
2. 画面遷移時に渡す Composeベース:NavigationCompose 値を渡す色々な方法 28/103
2. 画面遷移時に渡す Composeベース:NavigationCompose 値を渡す色々な方法 29/103
2. 画面遷移時に渡す Composeベース:NavigationCompose 値を渡す色々な方法 30/103
• 値を渡す色々な方法 1. メソッドの引数に渡す 2. 画面遷移時に渡す 3. Pub-Sub 4. DI
5. データホルダーを使って受け流す 本日のお品書き 31/103
3. Pub-Sub Pub-Sub(Publish-Subscribe)モデルとは? 値を渡す色々な方法 参考:e-words Pub/Subモデル 32/103
3. Pub-Sub Pub-Sub(Publish-Subscribe)モデルとは? → 情報の発信側と受信側を直接つなげずにやり取りする仕組み 値を渡す色々な方法 33/103
3. Pub-Sub Androidアプリ開発では、EventBusが使われる(最近は使われてない) 値を渡す色々な方法 Publisher Subscriber EventBus イベント イベント 34/103
3. Pub-Sub 例:クラッシュイベントをアプリ内の別のクラスで受け取る 値を渡す色々な方法 35/94
3. Pub-Sub 例:クラッシュイベントをアプリ内の別のクラスで受け取る 値を渡す色々な方法 36/94
3. Pub-Sub 例:クラッシュイベントをアプリ内の別のクラスで受け取る 値を渡す色々な方法 37/103
3. Pub-Sub 例:クラッシュイベントをアプリ内の別のクラスで受け取る 値を渡す色々な方法 38/103
• 値を渡す色々な方法 1. メソッドの引数に渡す 2. 画面遷移時に渡す 3. Pub-Sub 4. DI
5. データホルダーを使って受け流す 本日のお品書き 39/103
4. DI(Dependency Injection) • 別のクラスの値を参照したい時に、Daggerを利用して、そのクラスのイン スタンスを別のクラスに注入する 値を渡す色々な方法 // HogeClass HogeClass
{ val hoge = “hoge!!” … … } // FooClass FooClass @Inject constructor( val hoge: Hoge ) { // 参照できた val hoge = hoge.hoge // hoge!! } DI 40/103
4. DI(Dependency Injection) • 例:アプリ名を取得するためにcontextのインスタンスをDaggerHiltで 注入する 値を渡す色々な方法 41/103
4. DI(Dependency Injection) • 例:アプリ名を取得するためにcontextのインスタンスをDaggerHiltで 注入する 値を渡す色々な方法 42/103
• 値を渡す色々な方法 1. メソッドの引数に渡す 2. 画面遷移時に渡す 3. Pub-Sub 4. DI
5. データホルダーを使って受け流す 本日のお品書き 43/103
5. データホルダーを使って受け流す • データホルダー:LiveData・StateFlow • 例:DBの値をStateFlowに詰めてUIに受け流す 値を渡す色々な方法 44/103
5. データホルダーを使って受け流す • データホルダー:LiveData・StateFlow • 例:DBの値をStateFlowに詰めてUIに受け流す 値を渡す色々な方法 45/103
5. データホルダーを使って受け流す • データホルダー:LiveData・StateFlow • 例:DBの値をStateFlowに詰めてUIに受け流す 値を渡す色々な方法 46/103
5. データホルダーを使って受け流す • データホルダー:LiveData・StateFlow • 例:DBの値をStateFlowに詰めてUIに受け流す 値を渡す色々な方法 47/103
• 値を渡す色々な方法 • 値を渡すだけじゃダメ!「いいね問題」の解決方法どっちが良い? • 解決方法を評価するための観点2つ • 「いいね問題」の解決方法をもう一度評価してみよう • まとめ
• 参考文献 本日のお品書き 48/103
やれることをやるだけではアプリのクオリティを維持できない! メリットやデメリットを理解した上でやり方を選ばないと、アプリの 保守性や可読性に悪影響を与えていることにすら気付けない...! 「いいね問題」を例に、値を渡す方法を評価する観点について 学んでいきましょう! 値を渡すだけじゃダメ!~ いいね問題の解決方法どっちが良い? ~ 49/103
いいね問題とは? • イベント一覧画面 と いいね一覧画面 がある • イベント画面のアイテムを「いいね」 して、いいね画面に行くと、 いいね画面のアイテムにも「いいね」
のマークがある 値を渡すだけじゃダメ!~ いいね問題の解決方法どっちが良い? ~ いいね いいね 50/103
いいね問題とは? • 2つの画面で「いいね」という 状態に整合性が取れている必要がある • それをどうやって実現するか? → 「いいね問題」と呼ばれている 値を渡すだけじゃダメ!~ いいね問題の解決方法どっちが良い?
~ いいね いいね 51/103
いいね問題とは? • いいね機能だけが「いいね問題」 になるわけではない! • 冒頭のスライドの既読の例も 「いいね問題」の1つ! 値を渡すだけじゃダメ!~ いいね問題の解決方法どっちが良い? ~
52/103
いいね問題の解決方法2つ提案! A. 画面遷移時に「いいね」の情報を渡す B. データホルダーを使ってDBから「いいね」の情報を受け流す 値を渡すだけじゃダメ!~ いいね問題の解決方法どっちが良い? ~ 53/103
いいね問題の解決方法2つ提案! A. 画面遷移時に「いいね」の情報を渡す B. データホルダーを使ってDBから「いいね」の情報を受け流す 値を渡すだけじゃダメ!~ いいね問題の解決方法どっちが良い? ~ 紹介した方法のうち、この2つ! A
B 54/103
どっちが良いと思いますか??? A. 画面遷移時に「いいね」の情報を渡す B. データホルダーを使ってDBから「いいね」の情報を受け流す 55/103
どっちが良いか、理由を答えられますか??? A. 画面遷移時に「いいね」の情報を渡す B. データホルダーを使ってDBから「いいね」の情報を受け流す 56/103
• 値を渡す色々な方法 • 値を渡すだけじゃダメ!「いいね問題」の解決方法どっちが良い? • 解決方法を評価するための観点2つ • 「いいね問題」の解決方法をもう一度評価してみよう • まとめ
• 参考文献 本日のお品書き 57/103
どっちが良いか、判断するための観点2つ 観点1. 良い設計 の条件を満たしているか 観点2. Androidアプリ特有の問題 を解決しているか 58/103
1. 良い設計の要素 ◦ SSOT ◦ UDF 2. Androidアプリ固有の問題 ◦ ライフサイクル
◦ 値を保持する方法 解決方法を評価するための観点2つ 59/103
1. 良い設計の要素 ◦ SSOT ◦ UDF 2. Androidアプリ固有の問題 ◦ ライフサイクル
◦ 値を保持する方法 解決方法を評価するための観点2つ 60/103
今回は「値の受け渡し」という観点に絞って 良い設計の要素を紹介します! • SSOT(Single Source Of Truth) • UDF(Unidirectional Data
Flow) 良い設計の要素2つ! 61/103
• 正確な情報源を一つだけ作成しよう、という意味 • SSOTのみがそのデータの変更を行える • SSOTは不変の型を使用してそのデータを公開する • メリット ◦ データの変更を追跡できやすく、バグを発見しやすい
◦ 他の型によって改ざんされないようにデータを保護できる SSOT(信頼できる唯一の情報源) 参考:Android Developers 信頼できる唯一の情報源 62/103
SSOT(信頼できる唯一の情報源) 参考:Android Developers 信頼できる唯一の情報源 どういうコト? 63/103
SSOT(信頼できる唯一の情報源) list … … 64/103
SSOT(信頼できる唯一の情報源) list … … 65/103
SSOT(信頼できる唯一の情報源) list … … detail 66/103
SSOT(信頼できる唯一の情報源) list … … detail 67/103
SSOT(信頼できる唯一の情報源) DB list … … detail 68/103
SSOT(信頼できる唯一の情報源) DB list … … detail ←このDBがSSOTだよ!というコト 69/103
• 状態はデータ層からUI層へ一方向に流れる(DBから読取り) • データを変更するイベントはUI層からデータ層へ流れる(DBへ書込み) • SSOTとセットの考え方 UDF(単方向データフロー) 参考:Android Developers 単方向データフロー
70/103
DB list … … detail UDF(単方向データフロー) 一方通行! 71/103
1. 良い設計の要素 ◦ SSOT ◦ UDF 2. Androidアプリ固有の問題 ◦ ライフサイクル
◦ 値を保持する方法 解決方法を評価するための観点2つ 72/103
値の受け渡しだけではなく、値の保持についても考える必要がある! → Androidアプリ固有の問題としてライフサイクルがあるから!! Androidアプリ固有の問題 と 値の保持 73/103
ライフサイクル → 画面回転などのコンフィギュレーション チェンジでもonDestroyが呼ばれて、Activityの インスタンスはメモリから破棄される 参考:Android Developers アクティビティのライフサイクル 74/103
ライフサイクル → 画面回転などのコンフィギュレーション チェンジでもonDestroyが呼ばれて、Activityの インスタンスはメモリから破棄される 参考:Android Developers アクティビティのライフサイクル → 場合によっては渡されてきたデータが消えてしまう?!
75/103
値を保持する方法についても考えないといけない • StateHolderで保持 • ストレージに保持 • savedStateHandle・onSaveInstanceState・rememberSavable 76/103
値を保持する方法 • StateHolderで保持 • ストレージに保持 • savedStateHandle・onSaveInstanceState・rememberSavable 77/103
StateHolderで保持 StateHolder = ViewModel・UIState・StateFlow 画面回転によってActivityのインスタンスは破棄されるが、 ViewModelは破棄されないので、ViewModel側に値を保持する という方法 アプリキルは(ViewModelが破棄されるので)乗り越えられないけど 画面回転は乗り越えられる 78/103
値を保持する方法 • StateHolderで保持 • ストレージに保持 • savedStateHandle・onSaveInstanceState・rememberSavable 79/103
ストレージに保持 オンメモリ VS ストレージ • オンメモリ:変数で値を保持する・onDestroyで破棄される • ストレージ:永続化すること・onDestoryで破棄されない ◦ Room・SQLite・SharedPreference・DataStore
を使う 80/103
値を保持する方法 • StateHolderで保持 • ストレージに保持 • savedStateHandle・onSaveInstanceState・rememberSavable 81/103
savedStateHandle・onSaveInstanceState・rememberSavable どれも一時的に値を保持して画面回転を乗り越えることができる≠永続化 • savedStateHandle ◦ ViewModelで値を保持 • onSaveInstanceState ◦ Activity・Fragmentで値を保持
• rememberSavable ◦ JetpackComposeのComposable内で値を保持 82/103
1. 良い設計の要素 ◦ SSOT ◦ UDF 2. Androidアプリ固有の問題 ◦ ライフサイクル
◦ 値を保持する方法 値の受け渡し方法を評価するための観点2つ 83/103
皆さんにもう一度、質問します 84/103
いいね問題とは? • 2つの画面で「いいね」という 状態に整合性が取れている必要がある • それをどうやって実現するか? → 「いいね問題」と呼ばれている 値を渡すだけじゃダメ!~ いいね問題の解決方法どっちが良い?
~ いいね いいね 85/103
どっちが良いと思いますか??? A. 画面遷移時に「いいね」の情報を渡す B. データホルダーを使ってDBから「いいね」の情報を受け流す 86/103
どっちが良いか、理由を答えられますか??? A. 画面遷移時に「いいね」の情報を渡す B. データホルダーを使ってDBから「いいね」の情報を受け流す 87/103
先ほど勉強した2つの観点を使って もう一度考えてみましょう! 88/103
• 値を渡す色々な方法 • 値を渡すだけじゃダメ!「いいね問題」の解決方法どっちが良い? • 解決方法を評価するための観点2つ • 「いいね問題」の解決方法をもう一度評価してみよう • まとめ
• 参考文献 本日のお品書き 89/103
A. 画面遷移時に「いいね」の情報を渡す B. データホルダーを使ってDBから「いいね」の情報を受け流す 「いいね問題」の解決方法をもう一度評価してみよう 90/103
A. 画面遷移時に「いいね」の情報を渡す 91/103
1. 良い設計の要素 ◦ SSOT→SSOTがないので❌ ◦ UDF→「いいね」情報の流れが一方通行でないので❌ 2. Androidアプリ固有の問題 と 値の保持
◦ ライフサイクルを乗り越えて値を保持できる →❓❓❓ A. 画面遷移時に「いいね」の情報を渡す 92/103
1. 良い設計の要素 ◦ SSOT→SSOTがないので❌ ◦ UDF→「いいね」情報の流れが一方通行でないので❌ 2. Androidアプリ固有の問題 と 値の保持
◦ ライフサイクルを乗り越えて値を保持できる →ViewModel側で状態を保持してれば画面回転は乗り越えられる が、永続化してないのでアプリキルするといいね情報が失われる A. 画面遷移時に「いいね」の情報を渡す 93/103
B. データホルダーを使ってDBから「いいね」の情報を受け流す DB 94/103
1. 良い設計の要素 ◦ SSOT→SSOTであるDBがあるので⭕ ◦ UDF→「いいね」情報の流れが一方通行なので⭕ 2. Androidアプリ固有の問題 と 値の保持
◦ ライフサイクルを乗り越えて値を保持できる →DBに永続化しており、画面回転もアプリキルも乗り越えられる ので⭕ B. データホルダーを使ってDBから「いいね」の情報を受け流す 95/103
A. 画面遷移時に「いいね」の情報を渡す → ❌ SSOT・UDFを満たしていない。ライフサイクルを考慮した値の保持ができていな い。 B. データホルダーを使ってDBから「いいね」の情報を受け流す → ⭕
SSOT・UDFを満たしている。ライフサイクルを考慮した値の保持ができている。 「いいね問題」の解決方法を評価した結果 96/103
設計やAndroidアプリの特徴を考慮して値の受け渡し 方法の良し悪しを評価することができましたね! 97/103
値の受け渡し方法について考える上で今回は「良い設計」と 「Androidアプリの特徴」に絞って触れた。 これ以外の観点で「プロダクトの特徴」も重要。 つまり「良い設計」や「Androidアプリの特徴」の観点で ❌が含まれるからといって、絶対的に悪だ!とは言い切れない。 プロダクトの特徴や様々なコストも考慮して意思決定しよう!! 🚨第3の観点:「プロダクトの特徴」 98/103
• 値を渡す色々な方法 • 値を渡すだけじゃダメ!「いいね問題」の解決方法どっちが良い? • 解決方法を評価するための観点2つ • 「いいね問題」の解決方法をもう一度評価してみよう • まとめ
• 参考文献 本日のお品書き 99/103
• Androidアプリ開発では値を受け渡したいシチュエーションがたくさんある • 値を受け渡す方法は色々ある ◦ メソッドの引数に渡す ◦ 画面遷移時に渡す ◦ Pub-Sub系
◦ DI ◦ データホルダーを使って受け流す まとめ 100/103
• どの方法が良いかを見極める上で「良い設計」と「Andoroidアプリ固有の特徴」 の2つの観点がある • 良い設計 の観点 ◦ UDF(単方向データフロー) ◦ SSOT(信頼できる唯一の情報源)
• Androidアプリ固有の特徴 ◦ ライフサイクルを乗り越えて値を保持する まとめ 101/103
• https://e-words.jp/w/Pub-Sub%E3%83%A2%E3%83%87%E3%83%AB.html • https://developer.android.com/topic/architecture?hl=ja#single-source-of-truth • https://developer.android.com/topic/architecture?hl=ja#unidirectional-data-flow • https://developer.android.com/guide/components/activities/activity-lifecycle?hl =ja#ondestroy •
https://github.com/iroha-168/PickUpConnpassEvents 参考文献 102/103
ご清聴ありがとうございました! 103/103