startActivityForResult()とonActivityResult()がDeprecatedになった対処法 / startActivityForResult() and onActivityResult() has Deprecated

13d936e697fe0f4fa96f926d0a712f6c?s=47 Sansan
June 20, 2020

startActivityForResult()とonActivityResult()がDeprecatedになった対処法 / startActivityForResult() and onActivityResult() has Deprecated

■イベント 

Sansan Android Engineer's Talk【オンライン開催】

https://sansan.connpass.com/event/176806/

■登壇概要
タイトル:startActivityForResult()とonActivityResult()がDeprecatedになった対処法
発表者:Sansan事業部 プロダクト開発部 古川真次

▼Sansan Builders Box
https://buildersbox.corp-sansan.com/

13d936e697fe0f4fa96f926d0a712f6c?s=128

Sansan

June 20, 2020
Tweet

Transcript

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

  2. 自己紹介 • 古川 真次(ふるしん) •  @furusin_oriver • Sansan,Inc. Android Engineer

    • 大阪府在住 • 趣味:勉強会の主催 ◦ GDG Osaka オーガナイザー ◦ Kansai.kt オーガナイザー
  3. • ComponentActivity ◦ startActivityForResult() ◦ onActivityResult() ◦ onRequestPermissionResult() 何がDeprecatedになるの? Activity

    Result APIs https://developer.android.com/jetpack/androidx/releases/activity#1.2.0-alpha04
  4. 呼び出される側(startActivityForResultで呼ばれるActivity)は何も変わりません 変わらないもの val intent = Intent().apply { putExtra(KEY_VALUE, 100) }

    setResult(Activity.RESULT_OK, intent) finish()
  5. Deprecatedになるのはいつから? https://developer.android.com/jetpack/androidx/releases/activity#1.2.0-alpha04

  6. • Java 8 • AppCompat1.1.0 • ActivityとFragmentのバージョンは合わせる ◦ 例:Activity 1.2.0-alpha03

    → Fragment 1.3.0-alpha03 前提条件は?
  7. 具体的な対応方法 明示的Intent

  8. 対応方法: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 } } }
  9. 対応方法: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)) }
  10. 対応方法: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() に代わるようなもの。
  11. • こう変わります② 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がなくなりました
  12. 何が嬉しいか

  13. 何が嬉しいか • リクエスト/レスポンスが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)) }
  14. 具体的な対応方法 暗黙的Intent

  15. 暗黙的Intent navigationButton.setOnClickListener { val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri?

    -> // do something with returned uri } getContent.launch("image/*") }
  16. • Activity Result APIに移行すると凝縮姓が上がる!可視性が上がる! • 使い方は主に引数のActivityResultContractsが変わるだけ まとめ

  17. 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 参考文献