Question Pourquoi excludeFromRecents supprime-t-il toutes les activités?


Mon application a deux points d'entrée (MainActivity et FromNotificationActivity).

Je souhaite que MainActivity apparaisse dans les tâches récentes, mais pas FromNotificationActivity)

Avec rien déclaré dans le manifeste, si je le fais ...

  • Activité principale
  • Arrière
  • FromNotificationActivity
  • Arrière

... Je trouve FromNotificationActivity dans les tâches récentes

Si j'ajoute android:excludeFromRecents="true" à FromNotificationActivity dans le manifeste et répétez la même séquence, je trouve rien dans les listes récentes.

Quelles incantations dois-je appeler pour qu'après la séquence d'étapes ci-dessus, j'obtienne MainActivity dans la liste récente.


24
2018-05-17 15:33


origine


Réponses:


Par défaut, toutes les activités d'une application ont la même affinité. Les activités avec la même affinité appartiennent conceptuellement à la même tâche. D'où dans ce cas les deux MainActivity et FromNotificationActivity appartiennent à la même tâche. android:excludeFromRecents s'assure que la tâche n'est pas répertoriée dans les applications récentes. C'est la raison, quand android:excludeFromRecents est réglé sur true pour FromNotificationActivity, MainActivity disparaît de l'histoire.

Solution:  Utilisation android:taskAffinity spécifier différentes tâches pour les deux activités. Utilisation android:excludeFromRecents pour FromNotificationActivity si cette tâche ne doit pas être affichée dans l'histoire du tout.

<activity   
    android:name="com.example.MainActivity"
    android:label="@string/app_name"
    android:taskAffinity=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity> 

<activity android:name="com.example.FromNotificationActivity"
    android:label="@string/notification_name"
    android:taskAffinity=".NotificationActivity"
    android:excludeFromRecents="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity> 

38
2018-05-21 10:01



De les docs

android: excludeFromRecents
Indique si la tâche lancée par cette activité doit être exclue de la liste des applications récemment utilisées ("applications récentes"). En d'autres termes, lorsque cette activité est l'activité racine d'une nouvelle tâche, cet attribut détermine si la tâche ne doit pas apparaître dans la liste des applications récentes. Définissez "true" si la tâche doit être exclue de la liste; mettre "false" si cela doit être inclus. La valeur par défaut est "false".

Donc ce n'est pas l'activité, mais la tâche que contrôle ce drapeau. Vous n'avez pas publié les éléments d'activité dans votre manifeste, mais je suppose que ces deux activités s'exécutent dans la même tâche. Changer le mode de lancement en singleTask sur les deux doit faire le travail.


5
2018-05-21 09:32



Vous devez utiliser l'indicateur d'intention de votre First_Activity à Second_Activity. Pas besoin de déclarer quelque chose dans le manifeste. En utilisant ce code, l'activité qui sera intentionnelle sera votre activité récente.

Intent intent = new Intent(CONTEXT_OF_CURRENT_ACTIVITY, YOUR_ACTIVITY.class);
intent.putExtra("NAME", "VALUE");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

J'espère que ce sera utile ..


0
2018-05-27 11:59