Результат действия API-метод ActivityResultLauncher launch() вызывает вызов не только метода createIntent() контракта, но и parseResult()
Я нахожусь в ActivityA, пытаюсь запустить ActivityB с вводом String, поработать и вернуть вывод String обратно в ActivityA. Я создал вспомогательный класс Activity Result API на основе этого руководства и (оба перечислены ниже). Я регистрирую результат активности в методе onCreate () ActivityA:
private lateinit var linkLauncher: ActivityResultHandler<String, String?>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
linkLauncher = ActivityResultHandler(this, extWebLinkAction, GetExtWebLinkContract())
}
Проблема в том, когда я звоню
linkLauncher.execute()
метод, который, в свою очередь, вызывает
ActivityResultLauncher
метода launch() оба метода контрактов вызываются до запуска ActivityB.
И вот как я пытаюсь вернуть результат ActivityB в ActiviteA:
setResult(Activity.RESULT_OK, Intent().apply {
putExtra(LINK_TRANSPORT_EXTRA, link)
})
Список упомянутых классов.
Класс помощника:
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.ActivityResultRegistry
import androidx.activity.result.contract.ActivityResultContract
import androidx.lifecycle.LifecycleOwner
import java.util.*
interface IActivityResult<I> {
fun execute(input: I)
}
class ActivityResultHandler<I, O>(
private val activity: ComponentActivity,
private val func: (O) -> Unit,
private val contract: ActivityResultContract<I, O>
) : IActivityResult<I> by ActivityResultHandlerImpl(
activity.activityResultRegistry,
activity,
func,
contract
) {
private class ActivityResultHandlerImpl<I, O>(
private val registry: ActivityResultRegistry,
private val lifecycleOwner: LifecycleOwner,
private val func: (O) -> Unit,
private val contract: ActivityResultContract<I, O>
): IActivityResult<I> {
private val callback = ActivityResultCallback<O> { output ->
func(output)
}
private var resultLauncher: ActivityResultLauncher<I>
= registry.register(UUID.randomUUID().toString(), lifecycleOwner, contract, callback)
override fun execute(input: I) {
resultLauncher.launch(input)
}
}
}
А вот и мой
ActivityResultContract
:
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.activity.result.contract.ActivityResultContract
import com.zultys.mobiledroid.mvvm.ui.chat.group.GroupActivity
import com.zultys.mobiledroid.mvvm.ui.profile.extweb.ExtWebLinkFragment
import com.zultys.mobiledroid.utils.extensions.logd
class GetLinkContract: ActivityResultContract<String, String?>() {
override fun createIntent(context: Context, input: String): Intent =
context.intentFor<ActivityB>
.newTask()
.putExtra(GROUP_ID_EXTRA, groupId)
override fun parseResult(resultCode: Int, intent: Intent?): String? =
when {
resultCode != Activity.RESULT_OK -> null
else -> intent?.getStringExtra(LINK_TRANSPORT_EXTRA)
}
}
1 ответ
Причина почему
parseResult()
позвонили сразу после того, как было
.newTask()
флаг в
createIntent()
метод. Кроме того, как заметил ianhanniballake, ключ не должен быть случайным.