Estoy en el proceso de intentar hacer una versión de lanzamiento de mi primera aplicación de Android para enviarla a algunos probadores. Sin embargo, me encontré con un problema. Cuando sale de la aplicación y luego vuelve a ingresarla iniciándola a través de su icono, reinicia toda la aplicación en lugar de regresar a su ubicación anterior. Esto ocurre incluso si vuelve a entrar inmediatamente después de salir. Sin embargo, no sucede si mantengo presionado el botón Inicio y lo lanzo a través de la lista de aplicaciones recientes.
He buscado en línea a otros que tienen este problema y hay algunos, pero nadie ha tenido una respuesta sólida de por qué les está sucediendo. Se ha sugerido en preguntas anteriores establecer el modo de lanzamiento en tarea única o instancia única en el archivo de manifiesto, pero eso no me ha ayudado y, además, por lo que tengo entendido, el comportamiento predeterminado para Android es volver al estado anterior de la tarea. en esta situación, así que no sé por qué necesitaría opciones de manifiesto especiales para hacer eso.
Lo más extraño de este problema es que si utilizo eclipse y el depurador para poner la aplicación en mi teléfono, este problema no ocurre. Ni siquiera necesito estar conectado al depurador, parece que mientras tenga una versión de depuración de la aplicación, el problema no ocurre. Pero si uso una versión de lanzamiento (la creo usando la opción de menú Herramientas de Android - Exportar paquete de aplicaciones firmado en Eclipse), el problema ocurre. Si alguien tiene alguna idea de lo que está causando esto, me encantaría escuchar sus pensamientos.
fuente
Respuestas:
Tuve el mismo problema con una aplicación y resolví este comportamiento agregando una bandera en
"android:launchMode="singleTop""
lugar de"android:launchMode="singleTask""
en la<activity>
declaración de su archivo AndroidManifest.xml. Espero que esto ayude a alguien.fuente
android:launchMode
atributo por completo, funcionó. No estoy seguro de si el valor predeterminado es "estándar", pero cualquier idea sería útil. Encontré esta gran explicación, pero es tarde, así que me parece un idioma extranjero en este momento: inthecheesefactory.com/blog/…Hasta ahora, descubrí que es un problema basado en cómo lo instalas en tu dispositivo real, específicamente:
Si lo instala utilizando una de las siguientes opciones, este problema no aparece:
Vaya a sdk / tools / usando una terminal o símbolo del sistema y luego escriba
adb install <FILE PATH OF .APK FILE>
En Linux, escriba:
./adb install <FILE PATH OF .APK FILE>
Simplemente ejecute su proyecto desde Eclipse.
Me complacería saber si existe alguna forma posible de distribuir los APK correctos para las pruebas beta. Ya intenté exportar un APK firmado porque cuando copias y pegas un APK y lo instalas manualmente, muestra el comportamiento malicioso.
Actualizar:
Encontré una solución. Siga estos dos pasos:
android:launchMode="singleTask" = true
para todas las actividades de su aplicación en AndroidMainifest.xml dentro de la etiqueta de actividad .Pon este código en la actividad de tu lanzador
onCreate()
.if (!isTaskRoot()) { final Intent intent = getIntent(); final String intentAction = intent.getAction(); if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) { finish(); return; } }
Este comportamiento es un error en Android. No es un caso especial.
fuente
Otra causa extraña, el reinicio ocurre solo cuando la aplicación se inició haciendo clic en "ABRIR" después de Copiar en el dispositivo - e - Instalar.
Prueba en OS8.1, sin launchMode en actividad.
fuente
Puede usar launchMode como singleTop para la actividad del lanzador en AndroidManifest.xml
<activity android:name="<YOUR_ACTIVITY>" android:label="@string/app_name" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
fuente
// To prevent launching another instance of app on clicking app icon if (!isTaskRoot() && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN)) { finish(); return; }
escriba el código anterior en la actividad de su lanzador antes de llamar a setContentView. Esto solucionará el problema
fuente
Es el comportamiento predeterminado en Android. Para las compilaciones de depuración, funciona de manera diferente por alguna razón. Se puede resolver agregando
android:launchMode="singleInstance"
a la actividad, desea reiniciar después de iniciar desde el icono.fuente
Agregue esto a su primera actividad:
if (!isTaskRoot()) { finish(); return; } super.onCreate(savedInstanceState);
fuente
Intente usarlo
android:alwaysRetainTaskState
como se muestra en el siguiente ejemplo:<activity android:name="com.jsnider.timelineplanner.MainActivity" android:alwaysRetainTaskState="true" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
fuente
Para mí, descubrí que había publicado erróneamente
NoHistory = true
en mi atributo de actividad.[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]
Esto impidió que la aplicación reanudara esta actividad y se reiniciara
fuente
Puede intentar configurar
android:alwaysRetainTaskState="true"
su actividad de iniciador en AndroidManifest.xml.<activity android:name=".YourMainActivity" android:alwaysRetainTaskState="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Para obtener más detalles, puede consultar https://developer.android.com/guide/topics/manifest/activity-element.html#always
fuente
Veo este problema en Android TV en 2019. ¿Existe una solución mejor para él? otro que
if (!isTaskRoot()) { finish(); }
Funciona, pero parece un truco más que la solución real.
fuente
Todas las soluciones anteriores no funcionaron de manera uniforme en todos mis dispositivos. Funcionó en algunos Samsung pero no en todos.
La causa del problema para mí fue instalar el APK manualmente.
fuente
Para mí, la solución fue agregar
LaunchMode = LaunchMode.SingleTop
a mi atributo Actividad sobre la Actividad principal:/// <summary> /// The main activity of the application. /// </summary> [Activity(Label = "SilhuettePhone", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait, LaunchMode = LaunchMode.SingleTop, WindowSoftInputMode = SoftInput.AdjustResize)]
fuente
Cuando presiona el botón Atrás en Android,
onDestroy
se invoca el método (en lugar de presionar el botón Inicio, donde soloonPause()
se invoca método).Si necesita que su aplicación continúe donde la dejó, guarde el estado de la aplicación en su
onDestroy()
método y cargue ese estado en elonCreate()
método.fuente