es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo podemos utilizar Activity.finishActivity(REQUEST_CODE) si onActivityResult está obsoleto?

Quiero utilizar la nueva forma de iniciar una actividad y obtener el resultado de vuelta porque Activity.startActvityForResult está obsoleto. Actualmente, funciona bien.

   private val activityLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) {
    if (it.resultCode == "SOME_CODE") {
        //Hacer algo
    }
}

Para iniciar la actividad, solo necesitamos llamar al método de inicio.

 activityLauncher.launch(YOUR_INTENT)

El problema es que quiero cerrar todas las actividades que se iniciaron con el mismo código de solicitud utilizando Activity.finishActivity(REQUEST_CODE).

¿Cómo podemos hacer eso de esta nueva manera?

enter image description here

NOTA: No puedo utilizar Activity.FLAGACTIVITYCLEAR_TOP porque quiero volver a la pantalla principal sin llamar a una nueva solicitud de servicio. Solo quiero recargar una actividad desde la pila de actividades.

Gracias y disfruta tu vida.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, la nueva forma de iniciar una actividad usando ActivityResultContracts no ofrece una manera fácil de cerrar todas las actividades iniciadas con el mismo código de solicitud. Esto se debe a que la interfaz ActivityResultLauncher no proporciona una manera de acceder al código de solicitud.

    Una solución posible es realizar un seguimiento del código de solicitud usted mismo y usarlo para finalizar manualmente las actividades. Podría crear un mapa que asocie cada código de solicitud con una lista de actividades iniciadas con ese código, y luego usar este mapa para finalizar las actividades cuando sea necesario.

    Por ejemplo:

    class MyActivity : AppCompatActivity() {
        private val activityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == SOMECODE) {
                //Hacer algo
            }
        }
    
        //Mapa que asocia cada código de solicitud con una lista de actividades iniciadas con ese código
        private val activitiesMap = mutableMapOf<int,></int,><activity>>()
    
        fun launchActivity(intent: Intent, requestCode: Int) {
            val activities = activitiesMap.getOrDefault(requestCode, mutableListOf())
            activitiesMap[requestCode] = activities.apply { add(this@MyActivity) } //Agregar esta actividad a la lista
            activityLauncher.launch(intent)
        }
    
        //Función para finalizar todas las actividades iniciadas con el código de solicitud especificado
        fun finishActivities(requestCode: Int) {
            activitiesMap[requestCode]?.forEach { it.finish() } //Finalizar todas las actividades de la lista
            activitiesMap.remove(requestCode) //Eliminar la lista del mapa
        }
    }
    

    Con esta solución, puede llamar a launchActivity para iniciar una actividad con un código de solicitud específico, y usar finishActivities para finalizar todas las actividades iniciadas con el mismo código.

    Tenga en cuenta que debería agregar algunas comprobaciones de errores para manejar casos en los que el código de solicitud no es válido o no hay actividades en la lista.

Comments are closed.