四大組件之Activity

Activity詳解:


Activity生命週期:



一個Activity的啓動順序:
onCreate()——>onStart()——>onResume()

當另一個Activity啓動時:
第一個Activity onPause()——>第二個Activity    onCreate()——>onStart()——>onResume() 
——>第一個Activity   onStop()

當返回到第一個Activity時:
第二個Activity onPause() ——> 第一個Activity onRestart()——>onStart()——>onResume() 
——>第二個Activity   onStop()——>onDestroy()

一個Activity的銷燬順序:
(情況一)onPause()——><Process Killed> 
(情況二)onPause()——>onStop()——><Process Killed> 
(情況三)onPause()——>onStop()——>onDestroy()


生命週期的方法:

          onCreate :當活動第一次啓動的時候,觸發該方法,可以在此時完成活動的初始化工作。 
onCreate 方法有一個參數,該參數可以爲空( null ),也可以是之前調用 onSaveInstanceState ()方法保存的狀態信息。
    onStart :該方法的觸發表示所屬活動將被展現給用戶。
          onResume :當一個活動和用戶發生交互的時候,觸發該方法。
          onPause :當一個正在前臺運行的活動因爲其他的活動需要前臺運行而轉入後臺運行的時候,觸發該方法。這時候需要將活動的狀態持久化,比如正在編輯的數據庫記錄等。
          onStop :當一個活動不再需要展示給用戶的時候,觸發該方法。如果內存緊張,系統會直接結束這個活動,而不會觸發 onStop 方法。 所以保存狀態信息是應該在onPause時做,而不是onStop時做。活動如果沒有在前臺運行,都將被停止或者Linux管理進程爲了給新的活動預留足夠的存儲空間而隨時結束這些活動。因此對於開發者來說,在設計應用程序的時候,必須時刻牢記這一原則。在一些情況下,onPause方法或許是活動觸發的最後的方法,因此開發者需要在這個時候保存需要保存的信息。
          onRestart :當處於停止狀態的活動需要再次展現給用戶的時候,觸發該方法。

          onDestroy :當活動銷燬的時候,觸發該方法。和 onStop 方法一樣,如果內存緊張,系統會直接結束這個活動而不會觸發該方法。

·        onSaveInstanceState :系統調用該方法,允許活動保存之前的狀態,比如說在一串字符串中的光標所處的位置等。 

通常情況下,開發者不需要重寫覆蓋該方法,在默認的實現中,已經提供了自動保存活動所涉及到的用戶界面組件的所有狀態信息


Activity的啓動模式:


standard: 標準模式,一調用startActivity()方法就會產生一個新的實例。
singleTop: 如果已經有一個實例位於Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的實例。
singleTask: 會在一個新的task中產生這個實例,以後每次調用都會使用這個,不會去產生新的實例了。
singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity實例所處的task中,只能有這個activity實例,不能有其他的實例。


啓動模式的區別:


四種啓動模式的區別:
  所屬task的區別:

  一般情況下,“standard”和”singleTop”的activity的目標task,和收到的Intent的發送者在同一個task內,就相當於誰調用它,它就跟誰在同一個Task中。
  除非Intent包括參數FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啓動到別的task裏。
  “singleTask”和”singleInstance” 總是把要啓動的activity作爲一個task的根元素,他們不會被啓動到一個其他task裏。


  是否允許多個實例
  “standard”和”singleTop”可以被實例化多次,並且是可以存在於不同的task中;這種實例化時一個task可以包括一個activity的多個實例;
  “singleTask”和”singleInstance”則限制只生成一個實例,並且是task的根元素。
  singleTop 要求如果創建intent的時候棧頂已經有要創建的Activity的實例,則將intent發送給該實例,而不創建新的實例。


  是否允許其它activity存在於本task內
  “singleInstance”獨佔一個task,其它activity不能存在那個task裏;
  如果它啓動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task裏運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
  而另外三種模式,則可以和其它activity共存。


  是否每次都生成新實例
  “standard”對於每一個啓動Intent都會生成一個activity的新實例;
  “singleTop”的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。
  比如:
  現在task棧元素爲A-B-C-D(D在棧頂),這時候給D發一個啓動intent,如果D是 “standard”的,則生成D的一個新實例,棧變爲A-B-C-D-D。
  如果D是singleTop的話,則不會生產D的新實例,棧狀態仍爲A-B-C-D
  如果這時候給B發Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會生成B的新實例,棧狀態變爲A-B-C-D-B。
  “singleInstance”是其所在棧的唯一activity,它會每次都被重用。
  “singleTask” 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前臺。 當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法,
如果收到intent生成一個activity實例,那麼用戶可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章