Activity 1.2.0-alpha02
と Fragment 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を気にすることがなくなります。