Android:清除堆栈后如何从上次活动恢复

问题描述 投票:0回答:2

我有3个活动LandingActivity - > LoginActivity - > MainActivity我在Landing活动中有一个登录按钮,启动LoginActivity,成功登录后将我带到MainActivity,我在LoginActivity中清除了任务,所以当我按下MainActivity上的后退按钮时,app会转到后面因为它是任务中的根,问题是当我恢复它时从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)
android android-intent android-activity android-lifecycle
2个回答
1
投票

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

登录按钮行为:

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...
}

2
投票

当堆栈中没有活动时,就像你回到家中一样按回来,然后点击启动器图标,它将始终使用启动器intent-filter启动活动,无论最后打开什么活动或是否应用程序进程是否仍然存在。正如@TheHebrewHammer建议的那样,为了解决这个问题,你的LandingActivity可以作为基于保存数据和发布活动的导航决策树。您可以查看Google在Google I / O计划应用here中处理类似内容的方式

或者,如果您的LandingActivity没有显示很多UI并且只是要求与其他活动进行细分,那么您可以通过将MainActivity声明为启动器并检查登录会话来避免多次活动,如下所示:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.