[英]How to distinguish between switching an activity Vs switch to Home Screen in Android
[英]Is there any way to distinguish between an Android Activity onResume from the home screen?
是否有任何方法可以判斷主屏幕/啟動器是否正在恢復活動(即,調用了onResume)?
例如,如果我有一個包含兩個活動A和B的應用程序。
方案1:對活動A的某些用戶操作將調用活動B,將其置於前台-將活動A移至后台。 當活動A移入后台時,它將通過onPause()和onStop()。 用戶(現在位於活動B上)要么完成活動,要么單擊“后退”按鈕,使活動A返回到前台,從而導致onRestart(),onStart(),onResume()序列。
方案2:如果用戶在活動A處於前台時單擊“主頁”按鈕,然后從啟動器重新調用該應用程序,則它的生命周期與方案1相同。即,用戶單擊“主頁”按鈕。 活動通過onPause()和onStop()進行。 用戶再次啟動該應用程序,導致活動A回到前台,再次執行與場景1中相同的onRestart(),onStart(),onResume()序列。
據我所知,活動沒有辦法知道它是如何恢復的,只是知道它正在重新出現。 實際上,我感覺到Android中並沒有那么多的“應用程序”概念-就某種意義而言,它只有一個入口和出口點。
您可以捕獲在活動B上按下后退按鈕,並將一個額外的值傳遞給活動A。如果有一個額外的值,那么該活動是從在活動B上按回該活動而恢復的;如果沒有額外的值,那么該活動將從被恢復的活動中恢復。隱。
在方案2中,您的活動將收到一個onNewIntent調用,並將啟動器意圖傳遞給它。
活動性A是否可以使用startActivityForResult()
啟動活動B,並使用onActivityResult()
檢測活動B是否完成?
因此,最初問題的直接答案可能是:否。 從(重新)啟動/恢復活動的意圖無法觀察到從主屏幕通過圖標啟動活動或從“最近”屏幕恢復活動。
但是,根據您要實現的目標,有一些方法:
檢查是否在您的活動上調用了onNewIntent
方法,以確定它是否已從啟動程序重新啟動。 作為前提,您需要在清單中將活動設置為singleTask / singleTop launchMode:
android:launchMode="singleTask"
根據您要實現的目標,這可能就足夠了! 但除此之外,您可能還必須處理用戶按下“后退”按鈕時發生的情況。 默認行為是完成並破壞您的活動。 因此,當從“最近”屏幕中選擇它時,將啟動它的全新副本。 盡管不會調用onNewIntent
,但所有內容都會從頭開始重建。 如果需要防止這種情況,可以使用:
override fun onBackPressed() {
moveTaskToBack(true)
}
最后,當您從某個活動“返回”時,您在onNewIntent
啟動的活動也不會被調用。 如果您進一步需要區分為什么要恢復活動,則可能要使用startActivityForResult
啟動第二個活動,以便在恢復活動時調用onActivityResult
。
完全不同的方法是在清單中有一個“啟動器”活動,該活動直接調用您的“主要”活動並完成自身。 調用主要活動時,您可以添加一個意圖附加內容,使您可以區分主要活動是否是第一次啟動。 由於額外的內容會在onResumes上出現,因此請確保在您首次“使用”它時將其覆蓋:
override fun onResume() {
super.onResume()
val firstLaunch = intent.getBooleanExtra(FIRST_LAUNCH, false)
intent.putExtra(FIRST_LAUNCH, false)
if (firstLaunch) {
// do something
}
}
從“啟動器”活動開始時:
intent.putExtra(FIRST_LAUNCH, true)
startActivity(intent)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.