我有一个非常基本的闪屏活动:
@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。
它与回调完全有关。直接启动活动时,没有问题。
修改
我找到了一个解决方案。使用延迟启动活动会解决它。虽然硬编码延迟不是很好。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(StartActivity.this, MainActivity.class));
finish();
}
},500);
编辑2
直接启动活动时,我没有这种行为。所以它可能与回调有关。我使用谷歌登录。看起来有些透明活动正在关闭。这可能是Google登录活动吗?
答案 0 :(得分:0)
您可以使用应用清单中的finish();
,而不是拨打android:noHistory="true"
,而不是:{/ p>
<activity
android:name=".SplashActivity"
android:noHistory="true" />
或者你可以在你的意图中使用FLAG_ACTIVITY_CLEAR_TOP
:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
编辑:
为什么使用android:launchMode="singleTask"
?
您应该将其更改为android:launchMode="singleInstance"
或完全删除此行。
有关详细信息,请here is a great article about launch modes
答案 1 :(得分:0)
我猜您的问题是由于在没有singleTask
的情况下使用launchMode 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>
希望它有所帮助!
答案 2 :(得分:0)
我无法重现您所描述的问题,但由于您说使用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);
}
}