Результат действия 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, ключ не должен быть случайным.

Другие вопросы по тегам