我有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)
你想要做的是在你的共享首选项中保存一个布尔值,保存登录状态。在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)
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...
}
当堆栈中没有活动时,就像你回到家中一样按回来,然后点击启动器图标,它将始终使用启动器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的意图数据传递信息。