Android : 如何在清除堆栈后从上一个 activity 恢复

Android : How to resume from last activity after clearing stack

我有 3 个活动 LandingActivity -> LoginActivity -> MainActivity 我在 Landing activity 中有一个启动 LoginActivity 的登录按钮,它在成功登录后将我带到 MainActivity ,我清除了 LoginActivity 中的任务,所以当我按下 MainActivity 上的后退按钮时,应用程序进入后台,因为它是任务问题是当我从 LandingActivity 恢复它时如何修复它以使其从 MainActivity

恢复

AndroidManifest

<activity android:name=".activity.LandingActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    <activity android:name=".activity.MainActivity"/>
    <activity android:name=".activity.SignUpActivity"/>
    <activity android:name=".activity.LoginActivity"/>

登录按钮中使用的意图

val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK )
startActivity(intent)

您要做的是在您的共享首选项中保存一个布尔值,以保存登录状态。在 LandingActivityonCreate 中检查该布尔值,如果为真,只需清除任务并跳转到您的 MainActivity 没有 UI 会显示,看起来用户只是直接转到主 activity。如果您随后实施注销,您的应用将自动恢复为旧行为。

登录按钮行为:

PreferenceManager.getDefaultSharedPreferences(this)
        .edit()
        .putBoolean("is_logged_in", true)
        .apply()
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or 
Intent.FLAG_ACTIVITY_CLEAR_TASK )
startActivity(intent)

LandingActivity 的 onCreate:

override fun onCreate(savedInstanceState: Bundle?) {
    val isLoggedIn = PreferenceManager.getDefaultSharedPreferences(this)
            .getBoolean("is_logged_in", false)
    if (isLoggedIn) {
        val intent = Intent(this, MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or 
        Intent.FLAG_ACTIVITY_CLEAR_TASK )
        startActivity(intent)
        return
    }
    // Your normal initialization code here...
}

当堆栈中没有活动时,例如,如果您按返回键直到 return 回到主页,然后单击启动器图标,它将始终启动带有启动器意图的 activity -filter,无论 activity 最后打开的是什么,或者应用程序进程是否仍然存在。正如@TheHebrewHammer 所建议的那样,为了解决这个问题,您的 LandingActivity 可以根据保存的数据和启动活动充当导航决策树。您可以在 Google I/O Schedule 应用 here

中查看 Google 如何处理类似的事情

或者,如果您的 LandingActivity 显示不多 UI 并且只是询问其他活动的赛格威,您可以通过将 MainActivity 声明为启动器并检查一个登录会话如下:

override fun onCreate(savedInstanceState: Bundle?) {
    if (!isUserLoggedIn()) {
        val intent = Intent(this, LoginActivity::class.java)
        startActivity(intent)
        finish()
        return
    }
    // continue as normal
}

如果在大多数情况下登录会话,大多数情况下您只会启动一个 activity,并且在某些情况下您不需要通过来自 LauncherActivity 的意图数据传递信息.