76 votes

Android: bug dans launchMode="singleTask"? -> l'activité de la pile, n'ont pas conservé

Mon activité principale A a comme ensemble android:launchMode="singleTask" dans le manifeste. Maintenant, chaque fois que je commence une autre activité à partir de là, par exemple, B et appuyez sur l' HOME BUTTON sur le téléphone pour revenir à l'écran d'accueil, puis retournez à nouveau dans mon application, soit par l'intermédiaire appuyant sur l'app bouton ou en appuyant sur l' HOME BUTTONlong pour montrer mon la plupart des applications récentes, il ne préserve pas mon activité pile et retourne directement à l' A à la place de l'activité B.

Ici, les deux comportements:

Expected: A > B > HOME > B
Actual: A > B > HOME > A (bad!)

Est-il un paramètre que je suis absent ou est-ce un bug? Dans ce dernier cas, est-il une solution pour ce jusqu'à ce que le bug est corrigé?

Pour info: Cette question a déjà été discuté ici. Cependant, il ne semble pas qu'il y est une réelle solution à ce, encore.

47voto

renchenyu Points 319

Ce n'est pas un bug. Lorsqu'une existaient singleTask de l'activité est le lancement, toutes les autres activités ci-dessus dans la pile sera détruit.

Lorsque vous appuyez sur HOME et lancement de l'activité de nouveau, ActivityManger des appels à l'intention

{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]flag=FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_RESET_IF_NEEDED cmp=A}

Pour que le résultat soit A > B > ACCUEIL > A.

C'est différent quand Un de launchMode est "Standard". La tâche qui contient Un viendra au premier plan et de garder l'état de la même façon qu'avant.

Vous pouvez créer un "Standard" de l'activité par exemple. C que le lanceur et startActivity(A) dans la méthode onCreate de C

OU

Il suffit de supprimer l' launchMode="singleTask" et définissez FLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP drapeau lors de chaque appel d'une intention à Une

5voto

Eric Points 1508

Stefan, vous jamais trouver une réponse à cela? J'ai mis en place un cas de test pour cela et je vois la même (perplexe) comportement...je vais coller le code ci-dessous dans le cas où quelqu'un arrive et voit quelque chose d'évident:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example" >

  <uses-sdk android:minSdkVersion="3"/>

  <application android:icon="@drawable/icon" android:label="testSingleTask">

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

    <activity android:name=".ActivityB"/>

  </application>
</manifest>

ActivityA.java:

public class ActivityA extends Activity implements View.OnClickListener
{
  @Override
  public void onCreate( Bundle savedInstanceState )
  {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.main );
    View button = findViewById( R.id.tacos );
    button.setOnClickListener( this );
  }

  public void onClick( View view )
  {
    //Intent i = new Intent( this, ActivityB.class );
    Intent i = new Intent();
    i.setComponent( new ComponentName( this, ActivityB.class ) );
    startActivity( i );
  }
}

ActivityB.java:

public class ActivityB extends Activity
{
  @Override
  public void onCreate( Bundle savedInstanceState )
  {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.layout_b );
  }
}

J'ai essayé de changer minSdkVersion en vain. Cela semble juste être un bug, du moins d'après la documentation, qui stipule ce qui suit:

Comme indiqué ci-dessus, il n'y a jamais plus d'une instance d'un "singleTask" ou "instance unique" de l'activité, de sorte que l'instance est prévu pour gérer toutes les nouvelles intentions. Une "instance unique" de l'activité est toujours en haut de la pile (puisque c'est la seule activité à la tâche), de sorte qu'il est toujours en position de gérer l'intention. Cependant, un "singleTask" activité peut ou peut ne pas avoir d'autres activités au-dessus de la pile. Si c'est le cas, il n'est pas en position de gérer l'intention, et l'intention est supprimée. (Même si l'intention est tombé, son arrivée aurait causé la tâche à venir au premier plan, où il demeure.)

1voto

dtmilano Points 26472

Si A et B appartiennent à la même Application, essayez de retirer

android:launchMode="singleTask"

à partir de votre Activities et d'essai parce que je pense que le comportement par défaut est ce que vous avez décrit comme prévu.

0voto

Siddhartho Points 31

Chaque fois que vous appuyez sur le bouton home pour revenir à votre écran d'accueil de l'activité de la pile tue quelques de la déjà lancés et l'exécution des applications.

Pour vérifier ce fait, essayez de lancer une application à partir du panneau de notification, après le passage de A à B dans votre application et revenir à l'aide de la touche retour ..........vous trouverez votre application dans le même état que vous l'avez laissé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X