Actividad SingleTask, pero abierta a través de dos aplicaciones diferentes
Esta imagen fue muy útil para comprender la funcionalidad que ofrece el launhmode singleTask
, tomada desde aquí
Sin embargo, entendí esto en el caso de la misma aplicación, estoy teniendo problemas de entender lo que si ambas tareas pertenecen a dos aplicaciones diferentes
- Android - Problemas para iniciar la actividad correcta?
- Android Studio Requiere reconstruir cada ejecución
- Emulador de Android no utiliza HAXM
- Establecer el nombre de la aplicación en la etiqueta de la aplicación no funciona
- Proceso de lanzamiento de la aplicación Android
Escenario confuso (ficticio),
- Estaba pasando por una aplicación y la aplicación ofrecía una acción para enviar correos electrónicos, seleccioné la opción de ' enviar correo electrónico '.
- Se seleccionará la aplicación de correo electrónico predeterminada de mi teléfono y se abrirá su actividad (que se declarará como una sola tarea).
-
Mientras estaba escribiendo mi contenido de correo electrónico, cambié a alguna aplicación de chat y la aplicación se estrelló y me ofreció una opción para informar un problema a través de correo electrónico para el desarrollador, ahora, cuando selecciono " Informe ", mi aplicación de correo electrónico (que es el Misma aplicación de correo electrónico predeterminada).
-
Ahora, como la actividad raíz de la aplicación de correo electrónico es singletask, ¿mi contenido que he escrito será visible para mí?
Lo principal es que esta vez, las tareas / pilas pertenecen a dos aplicaciones diferentes.
- Lanzamiento de Android SDK manager - El directorio de herramientas no existe? Mac
- Lugar de lanzamiento de la aplicación de Android
- 'No se han encontrado dispositivos compatibles activos AVD's o dispositivos encontrados
- Iniciar actividad sólo una vez
- Android responde a la URL en intención
- Android singleTask o singleInstance modo de inicio?
- SINGLE_TOP | CLEAR_TOP parece funcionar el 95% del tiempo. ¿Por qué el 5%?
- Android singleinstance activity no solo si se pulsa el botón de nuevo
Aunque está utilizando 2 aplicaciones diferentes, funcionará de la manera esperada :
- Si su actividad
singleTask
ya existe, esa copia se utilizará, con el métodoonNewIntent()
siendo llamado - Si no existe, se lanzará según lo normal
Más técnicamente, la reproducción de la definición de su enlace:
El sistema crea una nueva tarea e instancia la actividad en la raíz de la nueva tarea. Sin embargo, si ya existe una instancia de la actividad en una tarea separada, el sistema direcciona la intención a la instancia existente a través de una llamada a su método onNewIntent (), en lugar de crear una nueva instancia. Sólo puede existir una instancia de la actividad a la vez.
Esto se puede verificar fácilmente al convertir una actividad en un objetivo para compartir texto y singleTask
en el manifiesto:
<activity android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
Ahora agregue un poco de registro a los onCreate()
y onNewIntent()
y realice algunas pruebas de escenarios.
Algo que me pareció especialmente útil al probar los diversos launchmodes es el siguiente comando ADB:
-
adb dumpsys activity activities
Esto genera una gran cantidad de texto (puede ayudar a reiniciar el teléfono antes de hacer esto – adb reboot
) mostrando detalles de las pilas de tareas de actividad. Esto se puede utilizar para mostrarle que su actividad singleTask
se "rehomes" a medida que se lanza a través de diferentes aplicaciones.
En cuanto a la pregunta sobre los mensajes de correo electrónico, creo que dependerá de qué cliente de correo electrónico que está utilizando, pero espero que manejar el método onNewIntent()
correctamente y guardar el borrador actual antes de mostrar su nuevo correo electrónico.