Pour les tests, je suis en permettant à mon application APK pour être téléchargé et installé via une URL. Une fois téléchargé sur le téléphone, il peut être lancé avec l'application Android de l'installateur qui donne à l'utilisateur une option pour l'installer sur leur appareil, puis l'exécuter.
Examiner si nous avons téléchargé et exécuté l'application de la manière décrite ci-dessus. Les principales applications de l'activité dans mon application est une page de connexion (Activity A
). Une fois l'utilisateur authentifié, elles sont prises à la zone principale de l'application, par exemple, Activity B
. Alors maintenant, l'activité actuelle de la pile de cette tâche est - A > B
.
Je puis appuyez sur le bouton d'accueil sur le téléphone et je suis pris à l'écran d'accueil Android. Je re-lancer mon application via l'icône dans le menu, et je suis pris à l' Activity A
, au lieu de Activity B
. Soit l'activité de la pile est maintenant A > B > A
, ou il y a maintenant deux tâches distinctes de l'activité, de meules A > B
, et A
respectivement. Ce que je veux, c'est être ramené à l' Activity B
quand je relance l'application. En appuyant sur l'arrière alors que, dans cet état me ramène à l' Activity B
.
Ce comportement indésirable se produit uniquement si j'ai d'abord ouvrir l'application via le programme d'installation, et pas si j'ouvre l'application via l'écran d'accueil/menu.
J'ai regardé dans la façon dont les activités sont en cours de démarrage par chaque mécanisme. Lorsque nous utilisons l'application de l'installateur, nous voyons les journaux suivants:
INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] }
via écran / écran d'accueil:
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] }
Lorsqu'il est démarré avec le programme d'installation, nous voyons que c'est à l'aide de l'indicateur 0x10000000
, mais lorsqu'il est démarré avec le lanceur, nous voyons que c'est à l'aide de 0x10200000
. Il est également à l'aide d'une intention catégorie.
À partir de la docs nous de voir les drapeaux sont:
public static final int FLAG_ACTIVITY_NEW_TASK
Constant Value: 268435456 (0x10000000)
public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
Constant Value: 2097152 (0x00200000)
Le drapeau FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
(qui est utilisé lorsque l'application est lancée à partir de l'écran de lancement) semble généralement de prévenir une nouvelle tâche d'être créé si il en existe déjà un, et de restaurer la dernière activité. C'est le comportement souhaité. Pourquoi n'est-il pas de travail dans cette situation? Est-ce que je peux faire pour m'assurer que ma demande sera toujours de me rendre à la dernière Activité qu'il a été commencé par le biais de l'application de l'installateur/lanceur?
Si j'utilise singleTask
il va toujours me ramener à l'activité principale (Activity A
) à chaque fois que je lance l'application (ce qui n'est également pas souhaitable).
Voici une question que j'ai trouvé où quelqu'un est confronté à un problème similaire (qui n'a pas accepté de répondre): App perd sa capacité à retenir sa pile lors du lancement d'une autre application.
EDIT: Vérification de l'indicateur FLAG_ACTIVITY_BROUGHT_TO_FRONT
en onCreate()
de notre lanceur d'activité (et puis de terminer si elle est définie) semble résoudre le symptôme principal, mais clairement la question sous-jacente est toujours là. Est-il plus complet fix?
EDIT2: Le même résultat se produit lorsque vous télécharger/exécuter l'application à partir de l'Android Market, de sorte que certaines des informations ci-dessus peuvent ne pas être pertinentes.