2011-03-16 8 views
6

¿Cómo puedo hacer que el navegador web llame a un esquema personalizado para iniciar una actividad, entonces quiero presionar el botón Atrás pero no devolver el navegador web.¿Cómo puedo hacer eso en Android? Actividad -> WebBrowser -> Acrivity, pero presione Atrás no vea el WebBrowser

Solo quiero implementar el reenvío cuando llamo a un navegador web y luego llamo a mi esquema para comenzar otra Actividad. Cuando regrese, no me gustaría ver el navegador web.

¿Cómo debo hacer eso?

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
i.setData(Uri.parse(url)); 
startActivity(i); 

Ya lo agregué, pero no funciona!

Respuesta

0

Esto probablemente se debe a que la segunda acción se puso en marcha en la misma tarea ha iniciado el navegador de, lo que significa que a partir de su la segunda actividad vuelve a la tarea ya existente con la actividad más alta (actividad 1) empujada a la pila posterior. Ver here.

Si inicia su segunda actividad en una tarea diferente, al presionar "volver" debe finalizar esa tarea y volver a la tarea que está detrás, el navegador.

Para lograr esto, se puede utilizar FLAG_ACTIVITY_NEW_TASK en la intención de iniciar la actividad 2, o un conjunto de atributos android:launchMode de la actividad a singleTop en su manifiesto.

+0

Gracias. ¡Entiendo! – HiMing

1

Al abrir su intención tal vez se puede establecer con la bandera sin historia

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
+0

Lo agregué, pero no funciona! – HiMing

+0

¿me puede decir cuál es la secuencia exactamente? – papachan

0

Descubrí que solo Intent.FLAG_ACTIVITY_NO_HISTORY funciona solo si el navegador no se ejecutaba antes. Si reinicio Android y ejecuto mi aplicación que llama al navegador todo funciona bien. Pero cuando inicio el navegador antes de mi aplicación, el navegador permanecerá en la historia.

Intenté agregar al manifiesto a la definición de actividad android: launchMode = "singleTop" según el usuario634618. Pero no funciona. No entiendo por qué singleTop debería ayudar.

En documentation es también esto:

BlockquoteAs otro ejemplo, la aplicación de navegador de Android declara que la actividad del navegador web debe siempre abierto en su propia tarea, especificando el modo de lanzamiento singleTask en el elemento. Esto significa que si su aplicación emite un intento de abrir el navegador Android, su actividad no se ubica en la misma tarea que su aplicación. En su lugar, se inicia una nueva tarea para el navegador o, si el navegador ya tiene una tarea ejecutándose en segundo plano, esa tarea se adelanta para manejar el nuevo intento.

Creo que esto causa el problema. Pero, ¿cómo forzar la ejecución del navegador en la tarea actual?

6

Según lo explicado por otros usuarios, su actividad se está creando en la pila del navegador. No puede evitar que el navegador se abra en su propia pila, pero puede hacer la misma configuración en su aplicación.

En su actividad que es llamado por el navegador, añada lo siguiente en el archivo de manifiesto:

android:allowTaskReparenting="true" 
android:launchMode="singleTask" 

Esto hará que su actividad sea creada en su pila de aplicaciones (en lugar del navegador de). Esto básicamente traerá su aplicación de vuelta al frente.

android: launchMode = "singleTop" no funcionará porque impide crear una nueva actividad solo si esa actividad está en la parte superior de la pila, que no es el caso, ya que el navegador es el que se encuentra actualmente en la parte superior. android: launchMode = "singleTask" se asegurará de que no se creen otras instancias, independientemente de que estén en la parte superior o no.

Si se establece el Intent.FLAG_ACTIVITY_NO_HISTORY con la configuración anterior, entonces todo debería funcionar bien, independientemente del navegador haber sido previamente abierto o no. En el peor de los casos, el navegador estará en la parte inferior de la pila y, si continúas respondiendo, eventualmente llegarás al navegador en lugar de salir de la aplicación.

+0

Acabo de editar mi respuesta. android: launchMode = "singleTask" es obligatorio para crear la actividad en la tarea de su aplicación. El navegador permanecerá en el historial independientemente de la bandera, pero de hecho se moverá al final de la pila. – AngraX

0

También conozco este problema. Aquí está el resumen:

  1. Si el navegador no se estaba ejecutando antes, que funciona bien con las respuestas anteriores; si el navegador se ejecutó antes:
  2. intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) NO funciona;
  3. android:allowTaskReparenting="true" android:launchMode="singleTask" se parece a poner el navegador en la parte inferior de la pila de la actividad, pero después de salir de la aplicación (por tecla BACK), con el tiempo el navegador se pone en marcha de nuevo.

Así que, básicamente, todavía existe este problema. Voy a publicar si encuentro una manera de resolverlo.

+0

No se pudo encontrar ninguna solución ... Así que la última opción es sobrescribir el manejador de la tecla ATRÁS para iniciar la pantalla INICIO después de presionar la tecla ATRÁS, siempre que la Actividad esté destinada a ir a la pantalla de inicio en la tecla ATRÁS. feo, pero funciona. – Mine

Cuestiones relacionadas