簡體   English   中英

完成舊活動並開始新活動,反之亦然

[英]Finish old activity and start a new one or vice versa

我知道,我用兩個代碼片段得到了相同的結果

finish();
startActivity(newActivity);

startActivity(newActivity);
finish();

我想知道你的意見,如果他們之間有很大的區別。 這個比那個好嗎? 如果是這樣,為什么?

當您執行 startActivity() 時,所做的只是將您的意圖發布到事件隊列中。 活動的實際啟動在不久的將來異步發生。 所以我看不出兩者有什么大的區別。

動畫明顯不同(至少在 4.1 之后)。 調用finish()首先開始淡出第一個活動,您可以在新活動淡入之前短暫地看到黑色背景。調用startActivity()首先淡入舊活動之上的新活動,而黑色背景不是可見的。

根據startActivity()finish()調用的順序,應用程序任務行為存在重要差異。

我所描述的情況僅適用於當前活動(被停止的活動)是任務中唯一的活動的情況。

通常,您會期望系統不會更改起始意圖(您為啟動另一個活動而創建的意圖)。 如果在調用startActivity()之前在任務中的最后一個活動上調用finish()則情況並非如此。

在這種情況下,系統組件 ActivityManager 在執行startActivity() Intent.FLAG_ACTIVITY_NEW_TASK標志添加到您的意圖中。

發生這種情況時,您可能會注意到 LogCat 中的日志條目類似於以下條目:

W/ActivityManager: startActivity 從完成 ActivityRecord{4a19b47 u0 com.foo.bar/com.foo.bar.SplashActivity t4928 f} 中調用; 強制 Intent.FLAG_ACTIVITY_NEW_TASK 用於: Intent { cmp=com.foo.bar/com.foo.bar.MainActivity }

這是(在某些情況下)事情可能出錯的轉折點。

總而言之,如果您想安全一點(而不是體驗添加到意圖中的FLAG_ACTIVITY_NEW_TASK意外副作用),那么順序必須是:

  • startActivity()
  • finish()

演示項目

屏幕錄像:

除了 Emmanuels 的回答:

startActivityfinish兩個方法都將在調用方法結束進行調度,因為它們都由 UI 線程處理。

我會做第二個選擇,我不支持我從官方來源查找的任何內容,但是,在您調用完成之前啟動新活動更有意義,這樣新活動會通過意圖彈出,現在后台活動可以調用它的所有清理方法。

如果你反過來做,也許意圖在清理完成之前沒有時間觸發。 即活動會在finish() 調用之后調用startActivity() 嗎?

我希望你明白我在說什么,為了安全起見,我會做第二個選擇。

我有類似的問題:

Activity A: singleInstance
Activity B: singleInstance
Activity C: singleInstance

A starts B 
B starts C
C wants to start A:

在這里,如果我使用:

finish();
startActivity(A);

一些連線發生了:活動 B 出現在前台而不是 A! 但是如果我像這樣更改代碼:

startActivity(A);
finish();

一切似乎都很好,活動 A 可見。

我不知道是什么問題,但似乎在第一種情況下,C 在執行 startActivity 命令之前完成,以便后台堆棧處理這種情況並顯示其頂部活動,即 B! 但在第二種情況下,一切正常。

我通常在finish() startActivity()之前執行startActivity() ,因為我認為這會確保新屏幕在前一個屏幕消失之前出現。

我的應用程序中有一個登錄頁面。 用戶登錄成功后,登錄活動消失,主活動啟動。 它在 Android 4 中運行良好。

今天我想用材料設計重寫它。 但是,我遇到了一個大問題。 新的 Android 工作室使用材料設計創建空白活動,我認為這需要很多資源。 同樣的過程,但我得到了錯誤

11-26 18:20:44.450 18397-18397/? I/Choreographer: Skipped 42 frames!  The application may be doing too much work on its main thread.
11-26 18:20:44.485 18397-18408/? I/art: Background partial concurrent mark sweep GC freed 2864(191KB) AllocSpace objects, 4(43MB) LOS objects, 13% free, 100MB/116MB, paused 8.056ms total 39.767ms

它說我的應用程序在我的手機 logcat 中啟動mainActivity時會占用很多資源。 我在mainActivity什么都沒有,只是它是默認的 Material Design 布局。

我顛倒了順序,現在它可以在我的手機上正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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