3

Salut Je développe des raccourcis pour l'application Android. Mon code ressembleRaccourcis dynamiques Android n'ouvrant pas l'activité correcte deuxième fois

private void setShortMenu() { 

    ArrayList<ShortcutInfo> shortcutInfos = new ArrayList<>(); 

    Intent intent = new Intent(this, SampleActivity2.class); 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.putExtra("val",1); 
    intent.addCategory("android.shortcut.conversation"); 
    ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); 

    ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id2") 
      .setShortLabel("Web site") 
      .setLongLabel("Open the web site") 
      .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher)) 
      .setIntent(intent) 
      .build(); 
    shortcutInfos.add(shortcut); 

    Intent intent2 = new Intent(this, SampleActivity3.class); 
    intent2.setAction(Intent.ACTION_VIEW); 
    intent.addCategory("android.shortcut.conversation"); 
    intent.putExtra("val",2); 

    ShortcutInfo shortcut2 = new ShortcutInfo.Builder(this, "id1") 
      .setShortLabel("Web site...") 
      .setLongLabel("Open the web site...") 
      .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher)) 
      .setIntent(intent2) 
      .build(); 
    shortcutInfos.add(shortcut2); 

    shortcutManager.setDynamicShortcuts(shortcutInfos); 
} 

Mes regards manifeste comme ceci:

<application 
    android:name=".SampleApplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
      <!--<meta-data android:name="android.app.shortcuts" 
      android:resource="@xml/shortcuts" />--> 
    </activity> 
    <activity android:name=".SampleActivity" /> 
    <activity android:name=".SampleActivity2" /> 
    <activity android:name=".SampleActivity3"></activity> 

Problème avec ce code est comme ça. J'ai tué l'application de fond. cliquez sur le premier raccourci. Il ouvre SampleActivity2. J'ai minimisé l'application en cliquant sur le bouton d'accueil et cliquez sur le deuxième raccourci. Il ouvre SampleActivity3. Jusqu'à ce point tout est correct. Mais maintenant, si je clique sur le premier menu ou le deuxième menu, il ouvre toujours SampleActivity3 qui est la dernière activité minimisée. Si je fais même chose avec la manière statique des raccourcis il fonctionne très bien:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> 
<shortcut 
    android:shortcutId="compose" 
    android:enabled="true" 
    android:icon="@mipmap/ic_launcher" 
    android:shortcutShortLabel="@string/compose_shortcut_short_label1" 
    android:shortcutLongLabel="@string/compose_shortcut_short_label1" 
    android:shortcutDisabledMessage="@string/compose_shortcut_short_label1"> 
    <intent 
     android:action="android.intent.action.VIEW" 
     android:targetPackage="com.example.nilkash.shortcutmenu" 
     android:targetClass="com.example.nilkash.shortcutmenu.SampleActivity2" > 
     <extra android:name="val" android:value="1" /> 
    </intent> 
    <categories android:name="android.shortcut.conversation" /> 
</shortcut> 

<shortcut 
    android:shortcutId="compose1" 
    android:enabled="true" 
    android:icon="@mipmap/ic_launcher" 
    android:shortcutShortLabel="@string/compose_shortcut_short_label2" 
    android:shortcutLongLabel="@string/compose_shortcut_short_label2" 
    android:shortcutDisabledMessage="@string/compose_shortcut_short_label2"> 
    <intent 
     android:action="android.intent.action.VIEW" 
     android:targetPackage="com.example.nilkash.shortcutmenu" 
     android:targetClass="com.example.nilkash.shortcutmenu.SampleActivity3" > 
     <extra android:name="val" android:value="2" /> 
    </intent> 
    <categories android:name="android.shortcut.conversation" /> 
</shortcut> 

et manifeste j'ajouté:

<activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
      <meta-data android:name="android.app.shortcuts" 
      android:resource="@xml/shortcuts" /> 
    </activity> 

Y at-il quelque chose de mal dans mon code. Besoin d'aide. Je vous remercie.

+0

poster votre manifeste. –

+0

Question mise à jour avec le code manifeste. S'il vous plaît, aidez-moi. – nilkash

+0

Voir ma réponse pour une description de ce qui se passe. Que voudriez-vous arriver? –

Répondre

2

Cela peut être confirmé après que vous postez votre manifeste, mais je devine ce qui suit se passe:

Lorsque vous utilisez le premier raccourci, Android crée une nouvelle tâche pour votre application et lance SampleActivity2 dans la tâche. Vous appuyez ensuite sur HOME, qui envoie cette tâche en arrière-plan.

Maintenant, vous utilisez le deuxième raccourci. Comme SampleActivity3 a le même taskAffinity que SampleActivity2, Android ramène la tâche existante contenant SampleActivity2 au premier plan et lance SampleActivity3 dans cette tâche. Votre tâche contient maintenant SampleActivity2 ->SampleActivity3. Vous appuyez à nouveau sur HOME. La tâche est déplacée en arrière-plan.

Si vous utilisez maintenant le premier raccourci, Android reconnaît que vous essayez de lancer la «racine» Activity d'une tâche existante et met simplement la tâche existante au premier plan et ne lance aucun nouveau Activity. La tâche contient SampleActivity2 ->SampleActivity3. Vous verrez donc SampleActivity3 car il s'agit du premier Activity de la tâche. Ce comportement est exactement le même que lorsque vous avez, par exemple, Whatsapp en cours d'exécution, appuyez sur ACCUEIL, puis appuyez sur l'icône Whatsapp sur votre écran HOME. Cela ne "démarre pas Whatsapp depuis le début", cela ramène juste la tâche actuelle contenant Whatsapp au premier plan dans n'importe quel état où il était quand il a été déplacé en arrière-plan.

Si vous appuyez maintenant sur HOME et utilisez le deuxième raccourci, Android trouve votre tâche avec le même taskAffinity que SampleActivity3 et met la tâche existante au premier plan. Android va maintenant soit ne rien faire (si SampleActivity3 a launchMode="singleTop") ou créer une nouvelle instance de SampleActivity3 et lancer cela dans la tâche. Dans ce cas votre tâche contiendra 3 Activity instances: SampleActivity2 ->SampleActivity3 ->SampleActivity3 et vous verrez SampleActivity3 puisque c'est le Activity supérieur dans la tâche.

+0

Sur plus d'observation, j'ai trouvé la même chose. Si je l'implémente avec des raccourcis statiques avec le même type d'intentions. Ensuite, ça fonctionne bien. Mais si je le fais avec la manière dynamique des raccourcis cela ne fonctionne pas bien. Y a-t-il une différence entre ces deux approches? Si non, il devrait se comporter de la même manière dans les deux cas. S'il vous plaît corrigez-moi si quelque chose ne va pas. Je mets à jour ma question de manière statique. Sil te plait aide moi. – nilkash

+0

S'il vous plaît expliquer ce que "ça marche bien" signifie. Qu'attendez-vous si votre application est en arrière-plan depuis le raccourci 1 et que vous cliquez sur le raccourci 2? Avez-vous testé ce qui se passe lorsque votre application est en cours d'exécution et que vous utilisez un raccourci statique et appuyez sur le bouton RETOUR? Il y a une douzaine de manières différentes de construire cela et cela dépend de la navigation que vous voulez (ou que vous voulez) dans chaque cas. Vous pouvez afficher la pile d'activité à tout moment en utilisant les activités de l'activité 'adb shell dumpsys'. –

+0

Donc, le scénario est comme ceci en cas de raccourci statique -> cliqué sur raccourci1 il ouvre SampleActivity1. Cliquez sur le bouton d'accueil et apportez l'application en arrière-plan. Maintenant, cliquez sur le raccourci 2, il ouvre SampleActivity2.Cliquez sur le bouton d'accueil et apportez l'application en arrière-plan. Maintenant, cliquez à nouveau sur raccourci1 -> il ouvre SampleActivity1 ce qui est bien. – nilkash