我有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)
发布于 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...
}
发布于 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的意图数据传递信息。
https://stackoverflow.com/questions/52323422
复制相似问题