Pourquoi n'y a-t-il pas de capture d'écran dans les applications récentes lorsque vous finissez l'activité dans le firebase onAuthStateChanged

J'ai eu une activité splashscreen très basique:

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_start); FirebaseAnalytics.getInstance(this); mAuth = FirebaseAuth.getInstance(); mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { FirebaseAuth.getInstance().removeAuthStateListener(this); startActivity(new Intent(StartActivity.this, MainActivity.class)); finish(); } } }); } 

Cet écran de démarrage ouvre ma MainActivity . Lorsque je ferme cette activité, c'est la capture d'écran dans les applications récentes:

  • Utilisation des tags de fragment
  • Lecture du son du clavier par défaut lorsque les boutons sont pressés dans Android
  • Comment supprimer la barre des boutons en bas de l'écran
  • Comment savoir si le service est en cours d'exécution à l'aide du shell AdB dans Android?
  • Android Studio - Problème dans build.gradle erreur de traduction non saisie ExecutionException OutOfMemory
  • Projets de bibliothèque Android et devoir actualiser manuellement
  • Entrez la description de l'image ici

    Il semble qu'il s'agisse de faire une capture d'écran trop tard, ce qui se traduit par cette capture d'écran d'applications récentes imbriquées. Cela se produit également sur un périphérique réel. Comment puis-je résoudre ce comportement étrange?

    Les activités se manifestent:

     <activity android:name="activities.StartActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="activities.MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:launchMode="singleTask"> </activity> 

    Le problème semble ne pas être dans le mode de launchMode . Je continue d'avoir le même comportement. Même lorsque vous retirez le lauchmode.

    Cela n'a absolument rien à voir avec le rappel. Lorsque vous démarrez l'activité directement, il n'y a pas de problème.

    MODIFIER:

    J'ai trouvé une solution. L'utilisation d'un délai dans le démarrage de l'activité le résout. Bien qu'un retard dur ait été retardé.

     new Handler().postDelayed(new Runnable() { @Override public void run() { startActivity(new Intent(StartActivity.this, MainActivity.class)); finish(); } },500); 

    EDIT 2

    Je n'obtiens pas ce comportement lors du démarrage direct de l'activité. Donc, il a probablement quelque chose à voir avec le rappel. J'utilise Google sign-in. Il semble qu'une activité transparente soit fermée. Est-ce que cela pourrait être l'activité Google Sign-in?

  • La meilleure façon de montrer un indicateur de chargement / progression?
  • Android: comment fonctionnent les UUID bluetooth?
  • Quel est l'utilisation de <permission-group> dans Android?
  • Envoi de l'activité au fond sans fin
  • Comment puis-je ombre le PackageManager avec Robolectric
  • OAuth / OpenID - que dois-je utiliser?
  • 3 Solutions collect form web for “Pourquoi n'y a-t-il pas de capture d'écran dans les applications récentes lorsque vous finissez l'activité dans le firebase onAuthStateChanged”

    Au lieu d'appeler finish(); Vous pouvez utiliser l' android:noHistory="true" dans votre application comme android:noHistory="true" :

     <activity android:name=".SplashActivity" android:noHistory="true" /> 

    Ou vous pouvez utiliser FLAG_ACTIVITY_CLEAR_TOP dans votre intention:

     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    Modifier:

    Pourquoi utilisez-vous l' android:launchMode="singleTask" ? Vous devriez probablement changer cela pour android:launchMode="singleInstance" ou supprimer complètement cette ligne. Pour plus d'informations, voici un excellent article sur les modes de lancement

    Je suppose que votre problème est dû à l'utilisation de launchMode singleTask sans taskAffinity .

    Changeons AndroidManifest.xml

     <activity android:name="activities.StartActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="activities.MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:launchMode="singleTask" android:taskAffinity="your_any_string"> </activity> 

    Espérons que cela vous aidera!

    Je n'ai pas réussi à reproduire le problème que vous décrivez, mais puisque vous dites que l'aide de Handler.postDelayed() aide, essayez le code ci-dessous.

    En ajoutant / supprime l'auditeur entre onResume()/onPause() , vous évitez également de démarrer une activité lorsque votre application est en arrière-plan. En outre, si FirebaseAuth détient une liste d'auditeurs, il conservera des références à des activités qui ont déjà été détruites si la méthode onCreate() multiple, par exemple lors de la rotation. Vous pouvez donc éviter les fuites de mémoire.

     private FirebaseAuth.AuthStateListener authStateListener; @Override protected void onResume() { super.onResume(); FirebaseAnalytics.getInstance(this); authStateListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { FirebaseAuth.getInstance().removeAuthStateListener(this); authStateListener = null; startActivity(new Intent(StartActivity.this, MainActivity.class)); finish(); } } }; FirebaseAuth.getInstance().addAuthStateListener(authStateListener); } @Override protected void onPause() { super.onPause(); if (authStateListener != null) { FirebaseAuth.getInstance().removeAuthStateListener(authStateListener); } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.