【问题标题】:Activities' stack (after exit the app, the system clears stack if launchMode="singleInstance")活动的堆栈(退出应用程序后,如果launchMode =“singleInstance”,系统会清除堆栈)
【发布时间】:2016-12-06 11:26:09
【问题描述】:

我不明白为什么会发生这种情况:我需要在单个实例中创建每个 Activity,所以我将 android:launchMode="singleInstance" 放在 Manifest 中。但是当我在设备上按下“主页”并再次打开它时,系统会清除堆栈并打开根 Activity,而不是最后一个打开的 Activity。如何为用户保留最后一个打开的活动,但在清单中保留singleInstance

编辑: 清单

...   


    <application
       ...>           

        <activity
            android:name=".ui.login.LoginActivity"
            android:launchMode="singleInstance"
            android:screenOrientation="portrait"/>
        <activity
            android:name=".ui.activity.MainActivity"
            android:label="${app_title_constant}"
            android:launchMode="singleInstance"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <data android:scheme="${scheme}"/>

                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.more.service.ScannerActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme"/>
        <activity
            android:name=".ui.activity.CardsListForSendActivity"
            android:launchMode="singleInstance"
            android:screenOrientation="portrait"/>

        <activity
            android:name=".ui.activity.CountriesActivity"
            android:launchMode="singleInstance"
            android:screenOrientation="portrait"/>
        <activity
            android:name=".ui.activity.StepperCardPurchaseActivity"
            android:launchMode="singleInstance"
            android:screenOrientation="portrait"/>

        <service
            android:name=".service.CacheContactsIntentService"
            android:exported="false"/>
        <service
            android:name=".managers.push.PushNotificationExtenderService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.onesignal.NotificationExtender"/>
            </intent-filter>
        </service>

        <receiver
            android:name=".managers.push.PushBroadcastReceiver"
            android:enabled="true">
        </receiver>
    </application>

</manifest>

【问题讨论】:

  • 您“需要在单个实例中创建每个活动”是否有原因?如果没有,不要做你的用户没有预料到的事情。
  • @BartFriederichs 是根据客户的要求。另外,我使用 OneSignal 进行推送通知,当您点击推送时,它会打开 MainActivity,然后用户点击返回并再次查看 MainActivity,因此这是我需要 singleInstance 的第二个原因
  • 发布您的清单
  • 一般来说,使用launchMode="singleInstance" 是个坏主意。仅当您正在构建“启动器”类型的应用程序时才需要这样做。在所有其他情况下,这通常是错误的。
  • 您可以自己管理活动堆栈,这样您就没有MainActivity 的多个实例,如果这是您想要的。您可以根据需要使用singleTop 之类的启动模式,但您几乎不应该使用singleTasksingleInstance

标签: android android-activity launchmode


【解决方案1】:

不要使用launchMode="singleInstance"。这不是必需的,而且实际上对您不起作用。通常,指定“singleInstance”将导致每个Activity 被启动到它自己的单独任务中。但是,这不会在您的情况下发生,因为您没有在清单中指定“taskAffinity”。由于默认情况下所有活动都具有相同的任务关联性,因此它们都将最终在同一个任务中(即使您指定了“singleInstance”启动模式)。

删除所有launchMode 说明符,然后重试。

Android 的标准行为是当应用从前台被带到后台时(在按下 HOME 按钮并返回应用后),将用户返回到任务堆栈(与他离开时完全一样)。

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多