2017-02-09 4 views
4

Dans mon application, je crée une notification qui commence Détails Activité. Je veux ajouter cette activité au-dessus de tâche actuelle (ou pile arrière). Par exemple, je pense tâche d'application (retour de la pile) de se comporter comme ceci:Comment préserver la pile arrière (ou tâche) actuelle lorsque vous cliquez sur une notification?

enter image description here

mais je reçois ceci:

enter image description here

Je ne l'ai pas utilisé FLAG_ACTIVITY_CLEAR_TASK et FLAG_ACTIVITY_NEW_TASK drapeaux. Que devrais-je faire?

Editer: La première image n'est qu'un exemple. Je pense que le titre de la question est complètement explicite. Je veux ajouter Détails Activité au-dessus de la pile actuelle, et ne pas commencer avec une nouvelle tâche.

Voici comment je crée le PendingIntent:

// Details activity intent 
    Intent intent = new Intent(context, DetailsActivity.class); 
    intent.putExtra(Com.KEY_ID, event.getId()); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
      intent, PendingIntent.FLAG_UPDATE_CURRENT); 

Et ceci est le manifeste:

<activity 
     android:name=".MainActivity" 
     android:label="@string/app_name_system" 
     android:launchMode="singleTop" 
     android:theme="@style/AppTheme.NoActionBar"> 

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

    <activity 
     android:name=".NoteActivity" 
     android:label="@string/app_name_system" 
     android:theme="@style/AppTheme.NoActionBar" 
     android:windowSoftInputMode="stateHidden" /> 

    <activity 
     android:name=".DetailsActivity" 
     android:launchMode="singleTop" 
     android:label="@string/app_name_system" 
     android:theme="@style/AppTheme.NoActionBar" /> 
+0

Avez-vous essayé les drapeaux 'mettre Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP' pour l'intention? – sup4eli

+0

@ sup4eli Je l'ai fait maintenant, mais aucun résultat. –

Répondre

2

Vous pouvez utiliser PendingIntent.getActivities au lieu de PendingIntent.getActivity pour vous construire pile.

Intent mainActivityIntent = new Intent(context,MainActivity.class); 
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Intent noteActivityIntent= new Intent(context,NoteActivity.class); 
noteActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Intent detailActivityIntent= new Intent(context,DetailActivity.class); 

final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++, 
      new Intent[] {mainActivityIntent,noteActivityIntent,detailActivityIntent},PendingIntent.FLAG_UPDATE_CURRENT); 

Cela devrait résoudre votre problème.

ce lien pour Référez plus de détails Back to main activity from notification-created activity

+0

Je pense que c'est la voie à suivre, mais j'ai ajouté quelques explications supplémentaires aux questions. Je souhaite ajouter DetailsActivity à la pile ** current **, quelle qu'elle soit. Je pense que votre solution donne toujours Main> Note> Détails. Est-ce vrai? –

+0

Oui, ma solution donnera toujours cette stack-- Main> Note> Détails.Elle démarre réellement la nouvelle DetailActivity avec deux intentions d'activité dans la pile arrière. Ces deux intentions seront déclenchées et créeront deux nouvelles instances d'activité sur le bouton arrière. Cela ne va cependant pas ajouter d'activité à la pile en cours. –

1

Vous devez utiliser getActivities() et spécifier le chemin de navigation entier dans le troisième argument qui accepte un tableau d'intentions. Vous devez construire ce tableau dans l'ordre dans lequel la navigation de votre application doit fonctionner, c'est-à-dire, la plus à gauche étant l'activité racine/principale et plus bas les niveaux à partir de là.

Quelque chose comme ça

Intent mainActivityIntent = new Intent(context, MainActivity.class); 
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // only specify new task flag for MainActivity 

Intent noteActivityIntent= new Intent(context,NoteActivity.class); 

Intent detailsActivityIntent = new Intent(context, DetailsActivity.class); 

PendingIntent pendingIntent = PendingIntent.getActivities(context, 0, 
      new Intent[] {mainActivityIntent,noteActivityIntent,detailsActivityIntent},PendingIntent.FLAG_UPDATE_CURRENT); 

Notez que: Si votre application est déjà active, une fois que vous appuyez sur retour android vous ramènera à votre NoteActivity puis MainActivity. Il va redémarrer les activités si elles sont déjà là ou en créer de nouvelles autrement.

+0

L'image est juste un exemple. Je veux ajouter DetailsActivity en haut de la pile actuelle. Ne pas toujours commencer dans Main> Note> Détails. –

1

J'ai trouvé ce lien: Preserving Navigation when Starting an Activity. Bien qu'il ne fournisse pas la solution exacte à ma question, mais il produit le résultat souhaité.

Le lien décrit que nous devrions commencer DetailsActivity dans une nouvelle tâche avec une affinité différente.

Manifest:

<activity 
     android:name=".DetailsActivity" 
     android:excludeFromRecents="true" 
     android:label="@string/app_name_system" 
     android:launchMode="singleTop" 
     android:taskAffinity="" 
     android:theme="@style/AppTheme.NoActionBar" /> 

PendingIntent création:

Intent intent = new Intent(context, DetailsActivity.class); 
    intent.putExtra(Com.KEY_ID, event.getId()); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
      intent, PendingIntent.FLAG_UPDATE_CURRENT);