はじめに
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()を使用するほうがよいでしょう。
サンプル
(気が向いたときにコード追加します。)
まとめ
- 簡単な画面遷移がしたいときには
startActivity() - データのやり取りが必要な時、もしくは何かデータを返したい時には
startActivityForResult()-
新APIである、
registerForActivityResultを積極的に使用しましょう。
これで、「なぜstartActivity()とstartActivityForResult()が共存してるんだ?」という謎が解けました。メソッドはそれぞれに使い道があり、使うべき場面を考える必要があります。
-
新APIである、