〈kotlin〉Activity Result API

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

アプリ内の別のアクティビティや他のアプリのアクティビティを起動して結果を取得するとき、
startActivityForResult() API と onActivityResult()を使ったコードではなく、
Activity Result API を使った書き方が推奨されている。

コールバックの登録

まずregisterForActivityResult()を使って結果が返ってきた時の処理を指定する。
registerForActivityResult() は ActivityResultContract と ActivityResultCallback を受け取って、
他のアクティビティを開始するために使用する ActivityResultLauncher を返す。

val launcher = registerForActivityResult(GetContent()) { uri: Uri? ->
    // ここに返ってきたuriに対する処理を定義
}

この例ではGetContent()が ActivityResultContractにあたる。
ActivityResultContractはどのアクティビティを呼び出してどんな結果を受け取るのかを定義したもので、
基本的なアクションに対してはデフォルトのコンストラクタが用意されている。
(例えばGetContent()は保存されているコンテンツの中から選ぶとそのUriを返す)
コンストラクタは自分で作成することもできる。
https://developer.android.com/training/basics/intents/result?hl=ja#custom

ActivityResultCallbackには、ActivityResultContractで定義した出力に対する処理を記載する。

アクティビティの起動

上で定義したlauncherに対してlaunch()を呼び出すとアクティビティが起動される。
この時、指定したActivityResultContractのタイプに一致する入力を渡す。

val launcher = registerForActivityResult(GetContent()) { uri: Uri? ->
}

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    val selectButton = findViewById<Button>(R.id.select_button)

    selectButton.setOnClickListener {
        launcher.launch("image/*")
    }
}

アクテビティが完了して復帰すると、コールバックに登録した処理が実行される。



参考
アクティビティの結果を取得する  |  Android デベロッパー  |  Android Developers
ActivityResultContracts  |  Android Developers