Почему в последних приложениях нет скриншотов при финишной активности в firebase onAuthStateChanged

У меня очень простой вид на брызговик:

@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();
            }
        }
    });
}

Этот всплывающий экран открывает мой MainActivity. Когда я закрываю эту активность, это скриншот в последних приложениях:

введите описание изображения здесь

Похоже, что он делает снимок экрана слишком поздно, что приводит к этому скриншоту последних вложенных приложений. Это также происходит на самом устройстве. Как я могу решить это странное поведение?

Активация манифеста:

<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>

Проблема, похоже, не в launchMode. У меня такое же поведение. Даже при удалении lauchmode.

Он имеет абсолютно что-то общее с обратным вызовом. При непосредственном запуске операции нет проблем.

EDIT:

Я нашел решение. Использование задержки в начале действия разрешает его. Хотя жестко запрограммированная задержка isn; t это приятно.

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

РЕДАКТИРОВАТЬ 2

Я не получаю такого поведения при прямом запуске операции. Вероятно, это связано с обратным вызовом. Я использую вход в Google. Похоже, что какая-то прозрачная деятельность закрывается. Это может быть активность входа в Google?

Ответ 1

Вместо вызова finish(); вы можете использовать android:noHistory="true" в вашем манифесте приложения следующим образом:

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

Или вы можете использовать FLAG_ACTIVITY_CLEAR_TOP в своем намерении:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Edit:

Почему вы используете android:launchMode="singleTask"? Вероятно, вы должны изменить это на android:launchMode="singleInstance" или полностью удалить эту строку. Для получения дополнительной информации вот отличная статья о режимах запуска

Ответ 2

Я предполагаю, что ваша проблема возникает из-за использования launchMode singleTask без taskAffinity.

Измените файл 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>

надеюсь, что это поможет!

Ответ 3

Я не смог воспроизвести проблему, которую вы описываете, но поскольку вы говорите, что с помощью Handler.postDelayed() помогает, попробуйте код ниже.

Добавляя/удаляя слушателя между onResume()/onPause(), вы также не запускаете действие, когда ваше приложение находится в фоновом режиме. Кроме того, если FirebaseAuth содержит список слушателей, он будет хранить ссылки на действия, которые были уже уничтожены, если несколько раз ударил метод onCreate(), например, при вращении. Таким образом, вы можете избежать утечек памяти.

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);
    }
}