首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android :如何在清空堆栈后从上次活动中恢复

Android :如何在清空堆栈后从上次活动中恢复
EN

Stack Overflow用户
提问于 2018-09-14 08:29:11
回答 2查看 543关注 0票数 0

我有3个活动LandingActivity -> LoginActivity -> MainActivity我在登录活动中有一个登录按钮,可以启动LoginActivity,在成功登录后,它会将我带到MainActivity。我在LoginActivity中清除了该任务,因此当我在MainActivity上按下back按钮时,应用程序将返回,因为它是任务的根。问题是,当我从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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-14 08:41:40

您要做的是在您的共享首选项中保存一个布尔值,用于保存登录状态。在LandingActivity onCreate中检查一下布尔值,如果是真的,只需清除任务并跳转到你的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)

登陆活动的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...
}
票数 1
EN

Stack Overflow用户

发布于 2018-09-14 14:12:27

当堆栈中没有活动时,例如,如果您按back直到返回主页,然后单击启动器图标,它将始终使用启动器意图过滤器启动活动,无论最后打开的是什么活动,或者应用程序进程是否仍处于活动状态。正如@TheHebrewHammer所建议的,为了绕过这个问题,你的LandingActivity可以作为基于保存的数据和启动活动的导航决策树。你可以在谷歌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的意图数据传递信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52323422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档