LoginSignup
1
1

Android開発「startActivityとstartActivityForResultが共存してることってあるのか…」

Posted at

はじめに

Android開発でアプリケーションの異なる画面(アクティビティ)間での遷移は非常に一般的な操作です。
この記事では、開発時「えっ、なんでこのコードstartActivity()startActivityForResult()が両方あるの?」と思ったため、その違いについて調査しました。
(開発時に見ていたコードはJavaでしたが、今回はGoogle社がAndroidアプリの開発言語として公式認定したKotlinでサンプルコードを作成しています。)

startActivity()

基本的な使い方

はじめにstartAcitivty()についての説明も記載しておきます。
startActivity()これはアクティビティを単純に起動する基本的なメソッドです。
通常、このメソッドはIntentオブジェクトを引数として受け取ります。

val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)

このコードは、SecondeAcitivityという名前のアクティビティに遷移するものです。

データの受け渡し

Intentオブジェクトには、遷移先のアクティビティに渡すデータ(Extras)を格納することができます。

遷移先のSecondeAcitivityでこのデータを受け取るには以下のようにします。

val extras = intent.extras
val extraData = extras?.getString("extraData") ?: "No extra data"

startActivityの良い部分は、戻り値を気にする必要がないことです。
そのため、簡単な画面遷移をする際にはこちらを使用すれば問題ないでしょう。

startActivityForResult()

結果を返す必要がある場合は、startActivityForResult()メソッドを使用します。
以下にその使用例を示します。

registerForActivityResult

private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
    // リザルトを取得して処理を行う
    handleActivityResult(result.resultCode, result.data)
}

// ...

    buttonStartActivityForResult.setOnClickListener {
        val intent = Intent(this, SecondActivity::class.java)
        startForResult.launch(intent)
    }
}

startActivityForResult

// Deprecated ?
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("extraData", "Data from MainActivity for Result (Deprecated)")
startActivityForResult(intent, REQUEST_CODE)

// リザルトを取得して処理を行う
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE) {
            handleActivityResult(resultCode, data)
    }
}

startActivityForResult()registerForActivityResult()の2つの方法がありますが、後者が新しいAPIです。
startActivityForResult()は非推奨となっていた?ようなので、新しいAPIのregisterForActivityResult()を使用するほうがよいでしょう。

サンプル

mojikyo45_640-2.gif

(気が向いたときにコード追加します。)

まとめ

  • 簡単な画面遷移がしたいときにはstartActivity()
  • データのやり取りが必要な時、もしくは何かデータを返したい時にはstartActivityForResult()
    • 新APIである、registerForActivityResultを積極的に使用しましょう。
      これで、「なぜstartActivity()startActivityForResult()が共存してるんだ?」という謎が解けました。メソッドはそれぞれに使い道があり、使うべき場面を考える必要があります。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1