Класс StartActivityForResult
Класс ActivityResultContracts.StartActivityForResult
заменяет устаревший вызов
startActivityForResult на Activity Result API.
В launch
передают Intent,
в лямбде onResult приходит
ActivityResult с кодом и intent.
Регистрация через
rememberLauncherForActivityResult
или
registerForActivityResult.
Синтаксис
ActivityResultContracts.StartActivityForResult()
Пример
Давайте откроем вторую activity и прочитаем resultCode:
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var label by remember { mutableStateOf("abcde") }
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.StartActivityForResult(),
) { res ->
label = if (res.resultCode == Activity.RESULT_OK) {
"12345"
} else {
"abcde"
}
}
Button(onClick = {
val intent = Intent(
this@MainActivity,
SecondActivity::class.java,
)
launcher.launch(intent)
}) {
Text(text = "abcde")
}
Text(text = label)
}
}
}
class SecondActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setResult(Activity.RESULT_OK)
finish()
}
}
На экране после возврата с RESULT_OK
текст станет "12345".
Смотрите также
-
класс
ActivityResultLauncher,
который запускает intent -
тег
activity,
где регистрируют SecondActivity -
класс
PickVisualMedia,
узкий контракт вместо общего intent -
метод
registerForActivityResult,
регистрация вне Compose