簡體   English   中英

有什么方法可以從主屏幕上區分Android Activity onResume嗎?

[英]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是否完成?

因此,最初問題的直接答案可能是:否。 從(重新)啟動/恢復活動的意圖無法觀察到從主屏幕通過圖標啟動活動或從“最近”屏幕恢復活動。

但是,根據您要實現的目標,有一些方法:

  1. @superfell建議什么:

檢查是否在您的活動上調用了onNewIntent方法,以確定它是否已從啟動程序重新啟動。 作為前提,您需要在清單中將活動設置為singleTask / singleTop launchMode:

android:launchMode="singleTask"

根據您要實現的目標,這可能就足夠了! 但除此之外,您可能還必須處理用戶按下“后退”按鈕時發生的情況。 默認行為是完成並破壞您的活動。 因此,當從“最近”屏幕中選擇它時,將啟動它的全新副本。 盡管不會調用onNewIntent ,但所有內容都會從頭開始重建。 如果需要防止這種情況,可以使用:

override fun onBackPressed() {
    moveTaskToBack(true)
}

最后,當您從某個活動“返回”時,您在onNewIntent啟動的活動也不會被調用。 如果您進一步需要區分為什么要恢復活動,則可能要使用startActivityForResult啟動第二個活動,以便在恢復活動時調用onActivityResult

  1. 啟動器活動和Intent Extra

完全不同的方法是在清單中有一個“啟動器”活動,該活動直接調用您的“主要”活動並完成自身。 調用主要活動時,您可以添加一個意圖附加內容,使您可以區分主要活動是否是第一次啟動。 由於額外的內容會在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM