App completely restarting when launched by icon press in launcher

时间秒杀一切 提交于 2019-11-28 18:05:53
sky

I had the same problem with an application and I resolved this behavior adding flag "android:launchMode="singleTop"" instead of "android:launchMode="singleTask"" in the <activity> declaration of your AndroidManifest.xml file. Hope this will help somebody.

Jayant Arora

So far I've found out that it's an issue based on how you install it in your real device, specifically:

  1. If you simply copy and paste the APK to your device's local storage and install it from the device, regardless of whether it's signed or unsigned or taken from bin folder, it shows this behavior, app restarts from menu icon.

If you install it using one of the following options, This issue does not appear:

  1. Go to sdk/tools/ using a terminal or command prompt then type

    adb install <FILE PATH OF .APK FILE>
    

    In Linux, type:

    ./adb install <FILE PATH OF .APK FILE>
    
  2. Simply run your project from Eclipse.

I would be pleased to know if there's any possible way to distribute correct APKs for beta testing. I already tried exporting a signed APK because when you copy and paste an APK and install it manually it shows the rogue behavior.

Update:

I found out a solution. Follow these two Steps:

  1. Set android:launchMode="singleTask" = true for all activities of your app in the AndroidMainifest.xml inside the activity tag.
  2. Put this code in your Launcher Activity's onCreate().

    if (!isTaskRoot())
    {
        final Intent intent = getIntent();
        final String intentAction = intent.getAction(); 
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
            finish();
            return;       
        }
    }
    

This behavior is a bug in Android. Not a special case.

You could use launchMode as singleTop to the Launcher Activity in AndroidManifest.xml

       <activity
        android:name="<YOUR_ACTIVITY>"
        android:label="@string/app_name"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Another strange cause, restart occurs only when app was launched by clicking on "OPEN" after Copy-to-Device-&-Install.

Test on OS8.1, no launchMode in activity.

yak32

It is the default behavior in Android. For the debug builds it works differently for some reason. It can be solved by adding android:launchMode="singleInstance" to the activity, you want to restart after you launch from the icon.

 // To prevent launching another instance of app on clicking app icon 
        if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

            finish();
            return;
        }

write the above code in your launcher activity before calling setContentView. This will solve the problem

Add this to your first activity:

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);

You can try to set android:alwaysRetainTaskState="true" for your launcher activity in AndroidManifest.xml.

    <activity
        android:name=".YourMainActivity"
        android:alwaysRetainTaskState="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

For details you can see https://developer.android.com/guide/topics/manifest/activity-element.html#always

jsnid00

Try using android:alwaysRetainTaskState as shown in the following example:

<activity
    android:name="com.jsnider.timelineplanner.MainActivity"
    android:alwaysRetainTaskState="true"
    android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

When you press the back button in Android, the onDestroy method is invoked (as opposed to pressing the home button, where only the onPause() method is invoked).

If you need your app to continue where it left off, save the state of the app in your onDestroy() method and load that state in the onCreate() method.

All of the solutions above didn't work consistently on all of my devices. It worked on some Samsung but not all.

The cause of the problem for me was installing the APK manually.

For me the fix was adding LaunchMode = LaunchMode.SingleTop to my Activity attribute over the Main Activity:

/// <summary>
    /// The main activity of the application.
    /// </summary>
    [Activity(Label = "SilhuettePhone",
        Icon = "@drawable/icon",
        Theme = "@style/MainTheme",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
        ScreenOrientation = ScreenOrientation.Portrait,
        LaunchMode = LaunchMode.SingleTop,
        WindowSoftInputMode = SoftInput.AdjustResize)]

I see this issue on Android TV in 2019. Is there a better fix for it? other than

if (!isTaskRoot()) {
    finish();
}

It works but looks like a hack more than the actual solution.

For me, I found that I had erroneously posted NoHistory = true in my activity attribute

[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]

This prevented the app resuming into this activity and restarted

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!