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
Intent.putExtras()←これ
Search
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
930
Youtube like BottomNavigation
kobitokaba
0
280
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
300
Inside Jetpack Architecture Components
kobitokaba
0
250
Kotlinもう一歩
kobitokaba
8
17k
Other Decks in Technology
See All in Technology
AIによるクリエイティブ生成を行う上での試行錯誤
plaidtech
PRO
0
170
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
260
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
130
AIに賢く動いてもらうためのコンテキスト〜Snowflake女子会 vol.8
snowwmn0824
0
150
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
700
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
11
5k
Minecraft JavaのMODをSwiftで作る
1mash0
0
200
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
3
580
Oracle Cloud Network Path Analyzerを試してみた/I Tried Out Oracle Cloud Network Path Analyzer
masakiokuda
1
110
CLIライブラリ開発を支える技術
htnabe
0
150
AI coding 整合正規方法
philipz
0
490
おい、エージェントを使って終わらせろ
nwiizo
2
850
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
Believing is Seeing
oripsolob
1
220
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Abbi's Birthday
coloredviolet
4
10k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
400
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
The Pragmatic Product Professional
lauravandoore
37
7.4k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
Google's AI Overviews - The New Search
badams
0
1.6k
Side Projects
sachag
456
43k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
240
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ページ書き直します