【正社員】還元率83%【フリーランス】マージン一律5万円で案件をご紹介させていただきます。 詳細はこちら

【Android】<Kotlin>ActivityResultLauncherを使ったActivity間のデータ受け渡し完全ガイド

【Android】<Kotlin>ActivityResultLauncherを使ったActivity間のデータ受け渡し完全ガイド
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

本日は、
KotlinのActivityResultLauncherを使って他Activityからの結果を受け取る機能を
実際のコードを利用して徹底解説していきます!

この記事を読んでわかること…
・ActivityResultLauncherとは?
・ActivityResultLauncher の使い方
・ActivityResultLauncherを使ったActivity間のデータ受け渡し方法

目次

環境

  • Kotlin (ver 1.9.0)
  • Android Studio (Giraffe | 2022.3.1 Patch 3)

ActivityResultLauncher とは?

ActivityResultLauncher は、Androidでアクティビティ間のデータ受け渡しを行うためのクラスです。

androidx.activity.result パッケージに属するクラスで、
アクティビティやフラグメントから別のアクティビティを起動し、その結果を非同期で受け取る役割を担います。

元々この機能は、startActivityForResult と onActivityResult が担っていましたが
こちらの2つは Android 11 (API 30) 以降で非推奨となりました。

それに代わる形導で導入されたActivityResultLauncher は、より簡潔でエラーが少ないコードを書くことができます。

ActivityResultLauncherの活用例

ActivityResultLauncherは基本的に、
別のアクティブティを起動して、その結果を元のアクティビティやフラグメントに返すために使われます。


例えば、以下のようなシーンで利用することができます。

カメラやギャラリーの起動

真を撮影したり、ギャラリーから画像を選択する際に、結果として選んだ画像のURIを受け取る。

設定画面の起動と反映

設定画面を開いて、設定が完了した後に元の画面に戻り、変更内容を反映する。

ファイル選択

ユーザーがファイルを選択して、そのファイルのパスや内容を取得する。

ActivityResultLauncher の使い方

それでは、早速実装してみましょう!

今回は例として
ボタンを押下するとログイン処理が走り、ログイン結果に応じて「管理者用のview」か「一般ユーザー用のview」になるよう処理を分けみます。

イメージとしては

  • A画面 (MainActivity) でボタンを押すと、B画面 (LoginActivity) が起動
  • B画面でログイン処理を行う
  • A画面に戻った際に ActivityResultLauncher がログイン結果を受け取る
  • 結果に応じて、画面遷移処理を分岐

こんな感じです。

A画面 (MainActivity)

class MainActivity : AppCompatActivity() {
    private lateinit var loginLauncher: ActivityResultLauncher<Intent>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ActivityResultLauncherの登録
       loginLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                result.data?.let { data ->
                    val isUserAdmin = data.getBooleanExtra("isAdmin", false)
                    if (isUserAdmin) {
                        fetchAdminData()
                    } else {
                        fetchUserData()
                    }
                    finish()
                }
            }
        }

        // ボタンを押したらログイン画面へ遷移
        val loginButton: Button = findViewById(R.id.loginButton)
        loginButton.setOnClickListener {
            val intent = Intent(this, LoginActivity::class.java)
            loginLauncher.launch(intent)
        }
    }
}
サンプルコードの解説

9行目:

  • registerForActivityResult は、アクティビティやフラグメントで他の画面を起動し、
    その結果を受け取るための仕組みです。
  • ActivityResultContracts.StartActivityForResult() は、
    「別のアクティビティを起動して、結果を受け取る契約 (Contract)」を意味します。
  • この部分で、loginLauncher という ActivityResultLauncher が登録されます。

10〜12行目:

  • result には、起動したアクティビティから返された結果 (resultCode) やデータ (Intent) が格納されます。
  • result.resultCode でアクティビティの終了状態を判定します。
  • Activity.RESULT_OK は、ログインが成功したことを示します。
  • 受け取ったデータ (data) を使って、遷移先を柔軟に変更できます。

B画面 (LoginActivity)

class LoginActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        val loginButton: Button = findViewById(R.id.loginButton)
        loginButton.setOnClickListener {
            val resultIntent = Intent().apply {
                putExtra("isAdmin", true)
                putExtra("userName", "John Doe")
            }
            setResult(Activity.RESULT_OK, resultIntent)
            finish() // B画面 (LoginActivity) を終了してA画面に結果を返す
        }
    }
}
サンプルコードの解説

9〜13行目:

  • putExtra メソッドを使って Intent にデータをセットします。
  • その後、setResult(Activity.RESULT_OK, resultIntent) で結果をセットして終了します。
  • finish() を呼ぶことで LoginActivity が終了し、A画面に戻ります。

まとめ

おつかれさまでした。いかがでしたでしょうか!

ActivityResultLauncherを使うことで、データのやり取りや分岐処理がスムーズに記述できるようになります。

ぜひ覚えて、アプリ開発で試してみてくださいね〜!

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社テックブログをご愛読いただきありがとうございます。
当テックブログを運用している株式会社メモリアインクは、
【正社員】還元率83%
【フリーランス】マージン一律5万円で案件のご紹介
と、エンジニアの皆様に分かりやすい形で稼げる仕組みを構築し提供させていただいております。詳しくは弊社お問い合わせページ、プロフィールのQRコードを読み取り、LINEメッセージでお問い合わせいただけますと幸いです。

コメント

コメントする

目次