🍏

[Kotlin]Activityで結果を取得(Activity Result API)

2022/02/12に公開

経緯

Activityからの結果取得で、知らぬ間にonActivityResultが非推奨になっていたので。

これまでの方法

呼び出す側
FirstActivity

binding.sampleButton.setOnClickListener {
  startActivityForResult(SecondActivity.createIntent(this), REQUEST_CODE)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    when (resultCode) {
        Activity.RESULT_OK -> {
            data?.let { data ->
                val value = data.getIntExtra(SecondActivity.KEY_VALUE, 0)
                println($value)
            }
        }
    }
}

呼び出され結果を返す側
SecondActivity

binding.backButton.setOnClickListener {
  val intent = Intent().apply { putExtra(KEY_VALUE, 999) }
  setResult(Activity.RESULT_OK, intent)
  finish()
}

companion object {
 const val KEY_VALUE = "key_value"
}

これをActivity Result APIに置き換える

gradle設定

dependencies {
    def activity_version = "1.4.0"
    def fragment_version = "1.4.1"
    // Activity
    implementation "androidx.activity:activity-ktx:$activity_version"
    // Fragment
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
}

呼び出す側

FirstActivity

private val launcher: ActivityResultLauncher<Intent> =
  registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { value ->
        println($value)
   }

  binding.sampleButton.setOnClickListener {
     launcher.launch(SecondActivity.createIntent(this))
  }

呼び出され結果を返す側(SecondActivity)は特に変更無し。

Permissionについて

個人的にはrequestPermissionの実装ではActivity Result APIだと不便と感じた記憶が。
そこら辺も後々記事にして理解深めます。

参照

公式:Getting a result from an activity

Discussion