Habilita y personaliza la transferencia entre dispositivos

Continue On presenta nuevos métodos y clases para que indiques la compatibilidad con la función y proporciones los datos necesarios que se pasan. Esto te permite reanudar correctamente la experiencia del usuario en el dispositivo receptor.

Habilita la asistencia

La compatibilidad con Continuar en (desactivada de forma predeterminada) se debe implementar por actividad. Para habilitar la función, llama a setHandoffEnabled para indicar que la actividad actual está lista para la transferencia. Una vez que se llama a setHandoffEnabled(true, null), la transferencia puede ocurrir en cualquier momento de la actividad, por lo que solo debes llamarla cuando la actividad esté lista para transferirse.

Puedes verificar si la actividad habilitó Continuar con isHandoffEnabled. Si una actividad tiene habilitada la transferencia, también debe implementar onHandoffActivityDataRequested para garantizar que devuelva un HandoffActivityData no nulo, ya que no se implementa ningún comportamiento predeterminado.

class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...
    // Enable handoff
    setHandoffEnabled(true, null)
  }

  // Override and implement onHandoffActivityDataRequested
  override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
    // Create and return handoff data
  }
}

Configura el objeto HandoffActivityData con los extras pertinentes y un URI de resguardo para informar a Continuar en cómo realizar la transferencia al dispositivo receptor.

Hay dos situaciones en las que el sistema necesita estos datos:

  • La actividad pasa a segundo plano y se deben guardar los datos pertinentes.
  • La actividad está en primer plano y se solicitó el traspaso. Puedes verificar el estado de una solicitud de transferencia.

Verificar el estado

La clase HandoffActivityDataRequestInfo proporciona información sobre la solicitud actual para transferir una actividad. Usa isActiveRequest para determinar si la solicitud está activa en este momento. Si el método devuelve

  • true, la actividad actual está en primer plano y el usuario solicitó continuar en otro dispositivo; sin embargo, si
  • false: La actividad se detuvo y está en segundo plano, pero el usuario puede solicitar un traspaso en el futuro.

En el dispositivo de envío, si quieres mostrar la IU para indicar al usuario que se produjo o está en curso un traspaso, puedes verificar isActiveRequest para ver si hay una solicitud activa. Sin embargo, no ejecutes este código de forma síncrona como parte de onHandoffActivityDataRequested. En su lugar, pon en cola cualquier código para que se ejecute de forma asíncrona, de modo que no se bloquee ni se retrase la transferencia.

// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {

  // Check whether the handoff request is active
  if (handoffRequestInfo.isActiveRequest()) {
    // Asynchronously show UI to let users know a handoff is in progress
  }

  // Create and return handoff data
}

Crea datos de transferencia

Para asegurarte de que se pasen todos los datos relevantes y necesarios durante la transferencia con la función Continuar en, debes incluir los datos en el objeto HandoffActivityData.

La clase HandoffActivityData representa los datos de transferencia asociados con una actividad. HandoffActivityData informa a Continuar en… cómo controlar y volver a crear una actividad en el dispositivo receptor. Los datos de transferencia incluyen lo siguiente:

  • Nombre del componente (obligatorio): Es el ComponentName de una actividad correspondiente que se iniciará en el dispositivo receptor para reanudar el recorrido del usuario después de la transferencia. En la mayoría de los casos y para la replicación exacta de la actividad, este será el nombre del componente de la misma actividad que crea el HandoffActivityData.
  • Extras (opcional): Puedes especificar extras que se incluirán en el Intent de inicio de la actividad. Este es un PersistableBundle que se puede usar para proporcionar información adicional al componente. Los extras deben tener un tamaño inferior a 50 KB.

Para crear objetos HandoffActivityData, usa la clase de compilador HandoffActivityData.Builder. Para crear un compilador nuevo, pasa el ComponentName de la actividad que debería recibir la transferencia (por ejemplo, this.getComponentName para el Activity actual o un ComponentName(this, TargetActivity::class.java) explícito). Luego, usa el método setExtras para especificar extras de forma opcional. Por último, llama a build para crear el objeto HandoffActivityData.

// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {

  // Check whether the handoff request is active
  if (handoffRequestInfo.isActiveRequest()) {
    // Asynchronously show UI to let users know a handoff is in progress
  }

  val extras: PersistableBundle = PersistableBundle()
  // Put relevant and necessary values into extras (e.g. scroll position)
  extras.putString("data_id", getDataId())
  extras.putInt("scroll_position", getScrollPosition())

  // Create and return handoff data
  return HandoffActivityData.Builder(getComponentName()) // Designate handoff to the same activity
    .setExtras(extras)
    .build()
}

Configura la opción de resguardo web

En caso de que la actividad especificada no se pueda iniciar en el dispositivo receptor, también puedes usar setFallbackUri para establecer, de manera opcional, una URL de respaldo que se abra en el dispositivo en el navegador predeterminado del usuario.

Para permitir que la sugerencia de Continuar en aparezca en los dispositivos receptores en los que no está instalada tu app, pasa una instancia de HandoffActivityParams con setAllowHandoffWithoutPackageInstalled establecido en true cuando llames a setHandoffEnabled:

setHandoffEnabled(
  true,
  HandoffActivityParams.Builder()
    .setAllowHandoffWithoutPackageInstalled(true)
    .build()
)

Luego, incluye la URL de respaldo en tu HandoffActivityData:

val fallbackWebLink: Uri = Uri.parse("https://myapp.com/fallback?query=" + paramVal)

val handoffData: HandoffActivityData = HandoffActivityData.Builder(getComponentName())
  .setExtras(extras)
  .setFallbackUri(fallbackWebLink)
  .build()

Implementa la opción Directo a la Web

Como alternativa, para implementar la transferencia directa a la Web, pasa HandoffActivityParams con setAllowHandoffWithoutPackageInstalled(true) a setHandoffEnabled y usa el método HandoffActivityData.createWebHandoff para generar el HandoffActivityData:

val webHandoffLink: Uri = Uri.parse("https://myapp.com/handoff?query=" + paramVal)

val handoffData: HandoffActivityData = HandoffActivityData.createWebHandoff(webHandoffLink)

Recibe y controla el intent de transferencia

En el dispositivo receptor, tu app debe controlar la transferencia y recrear la experiencia del usuario desde el dispositivo emisor. Específicamente, en la actividad que especificaste en el HandoffActivityData que muestra onHandoffActivityDataRequested, debes controlar el intent y recuperar los extras que tienen información sobre cómo recrear la actividad de forma adecuada.

Si especificas el traspaso a la misma actividad, puedes recibir el intent en el método onCreate de la actividad para que los datos se puedan recuperar y completar previamente de forma adecuada para el usuario.

class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...

    // Get the launch intent and retrieve extras
    val intent: Intent = getIntent()
    if (intent != null && intent.hasExtra("data_id")) {
      val dataID: String = intent.getStringExtra("data_id")
      // Retrieve the data that corresponds to the data ID
      ...
      // Populate activity UI with relevant data
      ...

      if (intent.hasExtra("scroll_position")) {
        val scrollPosition: Int = intent.getIntExtra("scroll_position", 0)
        // Move the page to the scroll position
        ...
      }
    }
  }
}