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:

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?

  • Connectez-vous avec Facebook si un compte déjà lié à Google lors de l'inscription initiale dans Firebase Android
  • Problème de jeton FCM dans un périphérique Android
  • Impossible d'accéder à zzbql dans Firebase
  • Getting 'E / TokenRequestor: Vous avez une configuration OAuth2 incorrecte. Erreur détaillée: INVALID_AUDIENCE 'même après avoir fourni des identifiants de clients précis
  • Un jeton d'authentification invalide après 1 heure - Persistance du disque dans Firebase
  • Comment déterminer si un utilisateur Firebase est connecté en utilisant l'authentification facebook
  • Authentification du téléphone Firefase Android INVALID_APP_CREDENTIAL: la validation de l'application a échoué
  • Android Firebase - ne peut pas utiliser userid en utilisant getUid () - Erreur: sur la référence d'objet nul
  • 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.