[英]Android : How to resume from last activity after clearing stack
我有3個活動LandingActivity-> LoginActivity-> MainActivity我在Landing活動中有一個登錄按鈕,該按鈕啟動LoginActivity,成功登錄后將我帶到MainActivity,我清除了LoginActivity中的任務,因此當我按MainActivity上的向后按鈕時,應用程序將返回backroung由於它是任務的根源,問題是當我從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)
當堆棧中沒有活動時,例如如果您按回去直到回到家,然后單擊啟動器圖標,則無論最后打開了哪個活動,或者是否打開了活動器,它都將始終使用啟動器意圖過濾器啟動活動。應用程序進程是否仍然存在。 正如@TheHebrewHammer所建議的那樣,要解決此問題,您的LandingActivity可以基於已保存的數據和啟動活動充當導航決策樹。 您可以在此處通過Google I / O Schedule應用程序檢查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
}
如果大多數情況下是登錄會話,則大多數情況下您只會啟動一個活動,在某些情況下,您不需要通過LauncherActivity的意圖數據傳遞信息。
您想要做的是在共享的首選項中保存一個布爾值,以保存登錄狀態。在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...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.