1. 程式人生 > >安卓四大核心元件詳解

安卓四大核心元件詳解


 四種載入模式的區別
  所屬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鍵返回到這之前的狀態。
-----------------------------------
二、Service詳解

  service可以在和多場合的應用中使用,比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後臺繼續播放,比如檢測SD卡上檔案的變化,再或者在後臺記錄你地理資訊位置的改變等等,總之服務嘛,總是藏在後頭的。

  Service是在一段不定的時間執行在後臺,不和使用者互動應用元件。每個Service必須在manifest中 通過<service>來宣告。可以通過contect.startservice和contect.bindserverice來啟動。

  Service和其他的應用元件一樣,執行在程序的主執行緒中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子執行緒中實現。

  service的兩種模式(startService()/bindService()不是完全分離的):