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
920
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
300
Inside Jetpack Architecture Components
kobitokaba
0
250
Kotlinもう一歩
kobitokaba
8
17k
Other Decks in Technology
See All in Technology
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
240
Agent 時代の Kaggle 展望 / kaggle-in-the-agentic-era
upura
1
670
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
6
1k
TypeScript入門 2026
recruitengineers
PRO
2
500
20260804_Q4AzureUpdateBite_FabricDataAgentの精度を高める設計.pdf
matayuuu
1
120
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
【CEDEC2026】『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
1
200
ラジオの科学
frievea
0
280
サイバー捜査員研修(後半)
nomizone
1
810
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
1
360
第3回しろおびセキュリティスポンサーセッション
log0417
0
160
攻撃と防御で学ぶAI時代のプロダクトセキュリティ演習
recruitengineers
PRO
7
2.2k
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.3k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Designing for humans not robots
tammielis
254
26k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Discover your Explorer Soul
emna__ayadi
2
1.2k
A better future with KSS
kneath
240
18k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Music & Morning Musume
bryan
47
7.3k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
Paper Plane
katiecoart
PRO
2
52k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
450
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
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ページ書き直します