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
Intent.putExtras()←これ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kobito-kaba
October 27, 2017
Technology
280
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Intent.putExtras()←これ
Activityを呼び出す儀式をめぐる冒険
kobito-kaba
October 27, 2017
More Decks by kobito-kaba
See All by kobito-kaba
新規プロジェクトでやってよかったことまとめ
kobitokaba
1
910
Youtube like BottomNavigation
kobitokaba
0
270
Modularizing and Refactoring Android App with Clean Architecture
kobitokaba
0
300
Slice Your App
kobitokaba
2
1.3k
Inside Jetpack
kobitokaba
2
170
Generating and Transforming Kotlin code
kobitokaba
0
140
Conference Tourism
kobitokaba
0
290
Inside Jetpack Architecture Components
kobitokaba
0
250
Kotlinもう一歩
kobitokaba
8
17k
Other Decks in Technology
See All in Technology
FPC(フレキシブル)基板にZephyr実装してみた。
iotengineer22
0
170
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
150
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
160
クラウドファンディング版StackChan 3体(4体)をインタラクティブな体験型作品にして展示もした話 / スタックチャンお誕生日会2026
you
PRO
0
180
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
130
Kiro Ambassador を目指す話
k_adachi_01
0
130
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
160
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
480
2026-06-24_人とAIの責務分離に基づく開発プロセスの提案.pdf
takahiromatsui
0
120
Lightning近況報告
kozy4324
0
220
Flow 不死:AI 時代 DevOps 的不變本質
cheng_wei_chen
2
500
あなたの知らないPDFのアクセシビリティ
lycorptech_jp
PRO
0
240
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Optimizing for Happiness
mojombo
378
71k
Building Applications with DynamoDB
mza
96
7.1k
Tell your own story through comics
letsgokoyo
1
960
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
470
Code Review Best Practice
trishagee
74
20k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Transcript
Intent.putExtras()←これ Yahoo! JAPAN 森洋之
in the Stone Age
val intent = Intent(this, MyActivity2::class.java) intent.putExtra("foo", "FOO") intent.putExtra("bar", 333) startActivity(intent)
val intent = Intent(this, MyActivity2::class.java) intent.putExtra("foo", "FOO") intent.putExtra("bar", 333) startActivity(intent)
・口伝でのみ伝えられる、必須パラメータ ・パラメータの型は、ムラハチレベルの掟
val intent = Intent(this, MyActivity2::class.java) intent.putExtra("foo", "FOO") intent.putExtra("bar", 333) startActivity(intent)
・キモい
val intent = Intent(this, MyActivity2::class.java) intent.putExtra("foo", "FOO") intent.putExtra("bar", 333) startActivity(intent)
・手続き的で、あまり読みたくないコード
拡張関数
inline fun <reified T : Activity> Context.startActivity( noinline extras: (Intent.()
-> Unit)? = null) { val intent = Intent(this, T::class.java) extras?.let { intent.extras() } startActivity(intent) }
startActivity<MyActivity2>{ putExtra("foo", "FOO") putExtra("bar", 333) } ・だいぶ読みやすくなった
startActivity<MyActivity2>{ putExtra("foo", "FOO") putExtra("bar", 333) } ・相変わらず、村の掟ベースのActivity起動
Companion Object
companion object { const val EXTRA_FOO = "foo" const val
EXTRA_BAR = "bar" fun showFoo(context: Context, foo: String, bar: Int) { context.startActivity<MyActivity2> { putExtra(EXTRA_FOO, foo) putExtra(EXTRA_BAR, bar) } } }
MyActivity2.showFoo(this, "FOO", 333) ・型セーフ ・Null安全 ・村の掟からの解放
companion object { const val EXTRA_FOO = "foo" const val
EXTRA_BAR = "bar" const val EXTRA_HOGE = "foo" const val EXTRA_FUGA = "bar" fun showFoo(context: Context, foo: String, bar: Int) { context.startActivity<MyActivity2> { putExtra(EXTRA_FOO, foo) putExtra(EXTRA_BAR, bar) } } fun showHoge(context: Context, hoge: String, fuga: String) { context.startActivity<MyActivity2> { putExtra(EXTRA_HOGE, hoge) putExtra(EXTRA_FUGA, fuga) } } } 受け付けるパターンが増えると
companion object { const val EXTRA_FOO = "foo" const val
EXTRA_BAR = "bar" const val EXTRA_HOGE = "foo" const val EXTRA_FUGA = "bar" fun showFoo(context: Context, foo: String, bar: Int) { context.startActivity<MyActivity2> { putExtra(EXTRA_FOO, foo) putExtra(EXTRA_BAR, bar) } } fun showHoge(context: Context, hoge: String, fuga: String) { context.startActivity<MyActivity2> { putExtra(EXTRA_HOGE, hoge) putExtra(EXTRA_FUGA, fuga) } } }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) when { intent.extras.containsKey(EXTRA_FOO)
&& intent.extras.containsKey(EXTRA_BAR) -> { // foo pattern } intent.extras.containsKey(EXTRA_HOGE) && intent.extras.containsKey(EXTRA_FUGA) -> { // hoge pattern } else -> throw IllegalArgumentException("staticメソッドから起動してね ") } }
Sealed Class
private sealed class Extras { data class Foo(val foo :
String, val bar : Int) : Extras(), Parcelable { companion object { @JvmField @Suppress("unused") val CREATOR: Parcelable.Creator<Foo> = object : Parcelable.Creator<Foo> { override fun createFromParcel(source: Parcel): Foo = Foo(source) override fun newArray(size: Int): Array<Foo?> = arrayOfNulls(size) } } protected constructor(parcelIn: Parcel) : this(parcelIn.readString(), parcelIn.readInt()) override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(foo) dest?.writeInt(bar) } override fun describeContents(): Int = 0 } data class Hoge(val hoge : String, val fuga : String) : Extras(), Parcelable { companion object { @JvmField @Suppress("unused") val CREATOR: Parcelable.Creator<Hoge> = object : Parcelable.Creator<Hoge> { override fun createFromParcel(source: Parcel): Hoge = Hoge(source) override fun newArray(size: Int): Array<Hoge?> = arrayOfNulls(size) } } protected constructor(parcelIn: Parcel) : this(parcelIn.readString(), parcelIn.readString()) override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(hoge) dest?.writeString(fuga) } override fun describeContents(): Int = 0 } }
private sealed class Extras { data class Foo(val foo :
String, val bar : Int) : Extras(), Parcelable { companion object { @JvmField @Suppress("unused") val CREATOR: Parcelable.Creator<Foo> = object : Parcelable.Creator<Foo> { override fun createFromParcel(source: Parcel): Foo = Foo(source) override fun newArray(size: Int): Array<Foo?> = arrayOfNulls(size) } } protected constructor(parcelIn: Parcel) : this(parcelIn.readString(), parcelIn.readInt()) override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(foo) dest?.writeInt(bar) } override fun describeContents(): Int = 0 } data class Hoge(val hoge : String, val fuga : String) : Extras(), Parcelable { companion object { @JvmField @Suppress("unused") val CREATOR: Parcelable.Creator<Hoge> = object : Parcelable.Creator<Hoge> { override fun createFromParcel(source: Parcel): Hoge = Hoge(source) override fun newArray(size: Int): Array<Hoge?> = arrayOfNulls(size) } } protected constructor(parcelIn: Parcel) : this(parcelIn.readString(), parcelIn.readString()) override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(hoge) dest?.writeString(fuga) } override fun describeContents(): Int = 0 } } 論外
Parcelize
private sealed class Extras { @Parcelize data class Foo(val foo
: String, val bar : Int) : Extras(), Parcelable @Parcelize data class Hoge(val hoge : String, val fuga : String) : Extras(), Parcelable } ・Kotlin Android Extensionsで、Parcelableは簡単に作れる ・experimental注意
companion object { fun showFoo(context: Context, foo : String, bar
: Int) { context.startActivity<MyActivity2> { putExtra(EXTRAS_KEY, Extras.Foo(foo, bar)) } } fun showHoge(context: Context, hoge : String, fuga : String) { context.startActivity<MyActivity2> { putExtra(EXTRAS_KEY, Extras.Hoge(hoge, fuga)) } } }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) val extras =
intent.getParcelableExtra<Parcelable>(EXTRAS_KEY) ?: throw IllegalArgumentException("staticメソッドから起動してね ") when(extras) { is Extras.Foo -> { // foo pattern } is Extras.Hoge -> { // hoge pattern } } }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) val extras =
intent.getParcelableExtra<Parcelable>(EXTRAS_KEY) ?: throw IllegalArgumentException("staticメソッドから起動してね ") when(extras) { is Extras.Foo -> { // foo pattern } is Extras.Hoge -> { // hoge pattern } } }
委譲Property
class ExtraParcelable : ReadOnlyProperty<Activity, Parcelable> { override fun getValue(thisRef: Activity,
property: KProperty<*>) : Parcelable { return thisRef.intent.getParcelableExtra(EXTRAS_KEY) ?: throw IllegalArgumentException("extra parameter ${property.name} is null") } }
private val extras by ExtraParcelable() override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) when(extras) { is Extras.Foo -> { // foo pattern } is Extras.Hoge -> { // hoge pattern } } }
おまけ
改訂版が出ます ・2ヶ月半で500ページ書き直します