Почему в последних приложениях нет скриншотов при финишной активности в 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);
}
}