Let's say I have a simple app, with a SplashScreenActivity
and a MainActivity
.
Below is part of my AndroidManifest.xml
:
<activity android:name=".front.activities.splashscreen.SplashScreenActivity" android:launchMode="standard" android:screenOrientation="portrait" android:theme="@style/SplashTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".front.activities.main.MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/Main_Title" android:launchMode="singleTop" android:screenOrientation="portrait"/>
And my SplashScreenActivity
opens MainActivity
in onCreate()
.
The Problem
If the app is launched from Google Play instead of launcher, if I pressed home and click the app icon in the launcher, one more SplashScreenActivity
is launched again and therefore one more MainActivity
on the backstack.
Steps to reproduce
- Kill the app if it is opened.
- Open the app from Google Play.
- Press Home button
- Open the app from launcher. You will know notice that
SplashScreenActivity
has been launched again (Or by looking at logs) - Repeat step 3-4. Each time you repeat, one more
SplashScreenActivity
andMainActivity
is launched.
After several trials, if we press back button, we will notice that there are multiple MainActivity
in the back stack.
More information
- If the app is not started from Google Play, but from launcher at the very first time (step 2), this cannot be reproduced.
- Not only Google play, but any other app that sends an intent to start the app can reproduce this.
- If I first launch from launcher, and then from Google Play, 2
SplashScreenActivity
will be launched. But if I press app icon from launcher again, it will not create a 3rdSplashScreenActivity
. It will bring the first launchedMainActivity
to the top.
What have I tried
- Make
SplashScreenActivity
toandroid:launchMode="singleTask"
. Does not help. - Make
MainActivity
toandroid:launchMode="singleTask"
. This will prevent multipleMainActivity
from being created, but does not solve the problem of startingSplashScreenActivity
multiple times. You may also assumeMainActivity
should not be set tosingleTask
.
What I expected
By clicking on the app icon in the launcher, Android should be able to find out that in my task manager, the app is already launched and will simply bring it to the top.
How can I fix this?
2 Answers
Answers 1
Some launchers have this bug: when app is started from home screen, new instance of initial activity is created instead of resuming the app. It can be fixed by adding
if (!isTaskRoot()) { finish(); return; }
to onCreate()
of the initial activity. See also:
Resume last activity when launcher icon is clicked,
Resume the Top Activity instead of starting the Launcher Activity
Answers 2
add android:noHistory="true"
tag to splash screen activity. It always populates one instance and it is not stored in the back stack as well.
0 comments:
Post a Comment