Slide 1

Slide 1 text

startActivityForResult()と onActivityResult()がDeprecatedに なった対処法 Sansan株式会社 Sansan事業部 プロダクト開発部 古川 真次

Slide 2

Slide 2 text

自己紹介 ● 古川 真次(ふるしん) ●  @furusin_oriver ● Sansan,Inc. Android Engineer ● 大阪府在住 ● 趣味:勉強会の主催 ○ GDG Osaka オーガナイザー ○ Kansai.kt オーガナイザー

Slide 3

Slide 3 text

● ComponentActivity ○ startActivityForResult() ○ onActivityResult() ○ onRequestPermissionResult() 何がDeprecatedになるの? Activity Result APIs https://developer.android.com/jetpack/androidx/releases/activity#1.2.0-alpha04

Slide 4

Slide 4 text

呼び出される側(startActivityForResultで呼ばれるActivity)は何も変わりません 変わらないもの val intent = Intent().apply { putExtra(KEY_VALUE, 100) } setResult(Activity.RESULT_OK, intent) finish()

Slide 5

Slide 5 text

Deprecatedになるのはいつから? https://developer.android.com/jetpack/androidx/releases/activity#1.2.0-alpha04

Slide 6

Slide 6 text

● Java 8 ● AppCompat1.1.0 ● ActivityとFragmentのバージョンは合わせる ○ 例:Activity 1.2.0-alpha03 → Fragment 1.3.0-alpha03 前提条件は?

Slide 7

Slide 7 text

具体的な対応方法 明示的Intent

Slide 8

Slide 8 text

対応方法:startActivityForResult()とonActivityResult() ● 従来の書き方 navigationButton.setOnClickListener { startActivityForResult(SubActivity.createIntent(this), REQUEST_CODE) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_OK) { when (requestCode) { REQUEST_CODE -> {} // do something else -> {} // do nothing } } }

Slide 9

Slide 9 text

対応方法:startActivityForResult()とonActivityResult() ● こう変わります navigationButton.setOnClickListener { val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult? -> when (result?.resultCode) { Activity.RESULT_OK -> {} // do something else -> {} // do something } } startForResult.launch(SubActivity.createIntent(this)) }

Slide 10

Slide 10 text

対応方法:startActivityForResult()とonActivityResult() ● こう変わります① navigationButton.setOnClickListener { val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult? -> when (result?.resultCode) { Activity.RESULT_OK -> {} // do something else -> {} // do something } } startForResult.launch(SubActivity.createIntent(this)) } onActivityResult() に代わるようなもの。

Slide 11

Slide 11 text

● こう変わります② navigationButton.setOnClickListener { val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult? -> when (result?.resultCode) { Activity.RESULT_OK -> {} // do something else -> {} // do something } } startForResult.launch(SubActivity.createIntent(this)) } 対応方法:startActivityForResult()とonActivityResult() startActivityForResult() に代わるもの。REQUEST_CODEがなくなりました

Slide 12

Slide 12 text

何が嬉しいか

Slide 13

Slide 13 text

何が嬉しいか ● リクエスト/レスポンスが1箇所にまとまる ● REQUEST_CODEがない分明確に、シンプルになる navigationButton.setOnClickListener { val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult? -> when (result?.resultCode) { Activity.RESULT_OK -> {} // do something else -> {} // do something } } startForResult.launch(SubActivity.createIntent(this)) }

Slide 14

Slide 14 text

具体的な対応方法 暗黙的Intent

Slide 15

Slide 15 text

暗黙的Intent navigationButton.setOnClickListener { val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> // do something with returned uri } getContent.launch("image/*") }

Slide 16

Slide 16 text

● Activity Result APIに移行すると凝縮姓が上がる!可視性が上がる! ● 使い方は主に引数のActivityResultContractsが変わるだけ まとめ

Slide 17

Slide 17 text

Android Developers > Jetpack > Libraries > Activity https://developer.android.com/jetpack/androidx/releases/activity#1.2.0-alpha03 Getting a result from an activity https://developer.android.com/training/basics/intents/result サンプルコード https://github.com/furusin/ActivityResultApiSample 参考文献