ActivityResultContractを使ったActivity間のデータ受け渡し

Kenji Abe
4 min readMar 19, 2020

Activity 1.2.0-alpha02Fragment 1.3.0-alpha02 から ActivityResultContract が追加されました。

ActivityResultContract を使うことで、従来の onActivityResult とは違った方法でActivityの結果を受け取ることが可能になります。
ActivityResultContracts にいくつか用意されてるものがあります。

build.gradle

implementation "androidx.activity:activity-ktx:1.2.0-alpha02"
implementation "androidx.fragment:fragment-ktx:1.3.0-alpha02"

注意

実装時の注意は別の記事で書きましたので、合わせて確認してください。

StartActivityForResult

まずは単純にActivityの結果を受け取る方法です。
ActivityResultContracts.StartActivityForResult というのが用意されてるのでそれを使うと簡単にActivityの結果を受け取ることができます。

ここでは省略してますが、遷移先のActivityでは setResult で結果をセットしています。ここは今まで通りです。

RequestPermission

次にRuntime Permissionのリクエストです。 ActivityResultContracts.RequestPermission を使うと簡単に結果を取得できます。

すでに権限がある場合は何も起きないので、事前に ContextCompat.checkSelfPermission などで確認しておく必要があります。

ActivityResultContractの作成

上の2つの方法は、 ActivityResultContracts に用意されてるものを使いましたが、自分で ActivityResultContract を作ることも可能です。自作することで、結果をdata classなどで受け取ることが可能になります。

まずは ActivityResultContract を継承したクラスを作成します。例は以下のとおりです。

型パラメータの1つ目は createIntent に渡す型、2つ目は parseResult で返す型になります。

createIntent では、Intentを生成して返します。ここで引数もセットできます。上の例ではIntの引数をセットしています。

parseResult では onActivityResult のタイミングで呼び出されるものになります。ここで結果を確認して data class に変換することが可能です。

次に使う側です。使う側は単純に実装できます。

これを使うことによって、呼び出し側がIntentを気にすることがなくなります。

参考

--

--

Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO