画面を閉じた時に前の画面の結果によって処理を分ける方法をメモします。ActivityResultContracts.StartActivityForResult
を使用します。
Activity → Activityの遷移で結果を受け取る方法です。
呼び出し元
class MainActivity : AppCompatActivity() {
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
when (result.resultCode) {
RequestCode.OK.id -> {
// 成功処理
}
RequestCode.CANCEL.id -> {
// 処理がキャンセルされた
}
RequestCode.FAILED.id-> {
// 処理成功
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
launcher.launch(intent)
}
}
}
呼び出し先
class ResultActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
button.setOnClickListener {
try {
if (false) {// なんらかの条件の時
setResult(RequestCode.CANCEL.id)
finish()
}
setResult(RequestCode.OK.id)
finish()
} catch (e: Throwable) {
setResult(RequestCode.FAILED.id)
finish()
}
}
}
}
リクエストコード
enum class RequestCode(val id: Int) {
ALL(1000),
CANCEL(1001),
FAILED(1002),
}
呼び出し先でfinish
する際に処理の判断によってsetResult
の中身を変えています。
結果の判断方法としてActivity.RESULT_OK
やActivity.RESULT_FIRST_USER
がありますが、こちらはコードの処理の意図がわかりにくいため、成功・キャンセル・失敗の値を自分で作成して使用します。
参考リンク