天天看點

singletask生命周期

大家好,又見面了,我是你們的朋友全棧君。

1.singleTask和singletop都是保真了Activity在棧中的唯一性

  2.singleTask和singleTop執行個體存在時,都不會重新建立 new task

  不同之處有如下幾點:

  如果singleTask啟動的ActivityA位于棧底,在棧頂startActivity到這個ActivityA時會調動

onNewIntent->onStart->onResume。

  但singleTask啟動的的ActivityA不存在時,會重新建立ActivityA,調用方式OnCreate->OnStart->OnResume

  2.如果singletop啟動的ActivityB在棧底時,在棧頂startActivity到這個ActivityB時會重新調動

onCreate->onStart->onResume,但不會調用OnDestroy

  并且singletop啟動的的ActivityB不存在時,會重新建立ActivityB,調用方式OnCreate->OnStart->OnResume

  3.singleTask在棧底時,從棧頂startActivity到棧底ActivityA,那麼該棧startActivity的發起者的中間部分Activity會被銷毀。而singletop是逐級跳躍到棧頂

  singleTask

singletask生命周期

  singletop

singletask生命周期

  追加一點singleInstance,雖然也是保證唯一性,但改模式的Activity是全局性的唯一性,生命周期和應用程式相同,不能及時回收,此外的話Activity在MVC充當Controller的角色,

  這點顯然對singleIntance來說不适合,是以不建議使用。

  4.singleTask不适合充當ChildActivity,但singletop适合

  5.對作業棧,預設情況下,沒有任何影響,因為棧的taskid是相同的,可以擷取getTaskid(),預設情況下每個activity的taskid相同

  但是,如果自定義了棧的标簽(這個标簽相同的singletask activity在同一個作業棧中),那麼taskid就會初選差别

  android:taskAffinity=”com.sample.lanchmode.tester.main”,那麼一旦另一個作業棧被銷毀,下次必然重建(相信我,這不是廢話)。

  為了一句不是廢話,我需要來證明一下。

  當我們的初始加載WelcomeActivity界面—>HomeActivity界面時,如果将HomeActivity的啟動模式設定為sigleTask+android:taskAffinity=”自定義(一般是類名)”,

  ①那麼WelcomeActivity銷毀後,在到達HomeActivity之後,HomeActivity回作為一個新的作業棧棧底而存在,是以由HomeActivity啟動的Activity的TaskId和HomeActivity相同。

  ②這個過程,WelcomeActivity和HomeActivity的TaskId是不相同的,問題出現了,當我們按下 Home鍵,然後在點選桌面上的app圖示你會發現,WelcomeActivity再次出現了,

  而且再次進入了HomeActivity,并且這個HomeActivity調用了OnNewIntent,卻沒掉用OnCreate,是以來說他一直存在這,但你需要再次過渡才能找到它。

  (對于追求捕獲Home鍵讓app退出的讀者是一個喜訊,這樣可以做到每次Home之後都能再次進入登入界面),在這個過程中沒有直接進入HomeActivity,而是WelcomeActivity(有人說不對麼,不應該是這樣麼,在這裡不想解釋)。

  注意,使用了不同作業棧的Activity,會在最近打開的app顯示一個應用會出現2個界面。

  在這裡,需要強調一下singleTask+android:taskAffinity不一定必須使用,請依據需求而定,網上有人推薦使用,但我卻想說,不要盲目,并不是所有的應用都适合。

  1–>

singleTask+android:taskAffinity對于效率而言,優勢并不存在,比如設定程序的,但對于帶有登入狀态的app需要慎用,否則造成資訊洩露等問題,開發中隻使用singleTask即可。

  2–>

singleTask+android:taskAffinity适用于單使用者保密性的app(可做到Home之後下次必須登入才能檢視資訊),建議在這方面試試。

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/153258.html原文連結:https://javaforall.cn