Android初窺


一、App如何存在於系統?

       Android APP是用Java語言編寫的由Android SDK工具編譯並和其它資源文件一起打包到APK文件並安裝到手機上的應用。一個APK文件包含了要安裝的App所需要的一切內容。一旦APK安裝到設備上,每一個Android APP就生存在它自己的安全沙箱。
     (1)Android操作系統是一個多用戶Linux系統,每一個app就是一個不同的用戶
     (2)系統默認爲每個app分配獨一無二的用戶ID(uid),這個id僅僅是拱系統使用,而對於app本身是沒啥用的。系統會對app的所有文件都設置權限,這樣,只有被匹配相同的uid的app纔可以去使用它,也就是說,只有uid相同的應用之間可以互相共享資源,否則, 他們的資源將會互相隔絕。
     (3)每一個進程都有他自己的虛擬機,所以,一個應用的運行是獨立於其他應用的。
     (4)默認的,每一個應用都運行在它自己的Linux進程,當任何其他應用組件需要被執行的時候Android就會啓動一個進程,而當這個組件不在需要或者當系統需要回收內存時就會關閉進程。
       在這種方式下,Android系統的實現是最小優先原則,也就是說,每一個應用,它只能接近它需要去使用的組件而不能隨意去使用別的app的組件,這就爲app創建了一個很安全的環境,這樣一來app就不能在沒有權限的情況下去使用系統或其它的功能。
       但是,也有一些方式可以實現不同應用之間共享數據,我們可以爲多個app分配同一個uid(通過sharedUserid實現),這樣他們就可以互相訪問彼此的資源了。有時候爲了節省系統資源,app升值可以被安排在一個相同的Linux進程中運行並且共享一個VM實例,但是這個前提是要使用同一個簽名證書

二、Everything is Component

       每個Android應用都可以視爲是組件的集合,對於Android應用層開發者來說,就像是用Google提供好的一堆積木去構建自己的玩具一樣,而我將這個構建過程的方式稱之爲“組合模式”。這種組件式的設計思想極大的解放了程序的耦合度,例如,它的特性之一就是這些組件可以單獨的被調用和單獨的運行,比如,一個獨立的Activity用於展示在屏幕上用於和用戶交互,而Activity可以啓動一個Service獨立的在後臺運行。甚至一個組件可以用Intent啓動另個app的其他組件,比如,在啓動地圖應用中一個Activity用於顯示地址。由此可見,組件之間的耦合度是極其低下的,他們之間僅僅需要一個Intent就可以彼此被調用,不會強制的依賴於彼此。也正因爲如此,Intent可以被視爲組件之間的“信使”。
       Android中總共有四種不同類型的組件,每一個都代表了不同的服務意圖並且有不同的生命週期,這個週期就定義了組件何時被創建和銷燬。

1、Activity組件

      一個Activity代表了一個單屏幕界面用於用戶交互,比如,一個郵件app可能有一個Activity顯示新郵件列表,另一個Activity用於編輯郵件,還有一個Activity用於閱讀郵件(郵件詳情界面)。儘管這些Activity共同構建了一個有着友好用戶體驗的郵件app,但是每一個Activity都是獨立於其他的Activity的。與此類似,另一個不同的app也可以調用郵件app的任何一個Activity(如果郵件app允許的話),比如,在郵件app中可以啓動一個相機app的Activity。

2、Service組件

       一個Service組件代表了一個運行在後臺的長時間操作或執行遠程進程任務。一個Service不會提供用戶界面,比如,在一個Service在後臺播放音樂的情況下,用戶還可以去玩其他的應用。此外,Service還可以用於從網絡獲取數據而不阻塞用戶界面(之後會詳細介紹,Service並不是開啓了新的進程或線程。其他的組件比如Activity可以啓動一個Service。

3、ContentProvider組件

       一個ContentPrvider組件管理了一系列共享的數據,你可以將數據存儲在文件、SQLite數據庫、web端服務器、或者任何你app可以接近的永久性存儲的地方。通過ContentProvider,其他應用可以查詢或修改數據(如果ContextProvider允許的話)。比如,Android系統提供了一個ContentProvider管理了用戶的聯繫人信息,所以我們可以在應用中使用系統的聯繫人通訊錄功能。與此類似,任何app在權限允許的情況下都可以差羣ContentProvider的內容去讀取和寫入信息。ContentProvider也可以用於讀取和寫入app的私有數據,而不去共享給其他應用。

4、BroadcastReceiver組件

       一個BroadcastReceiver是一個用於響應系統範圍內通知的組件,Android系統內置了很多系統級別的廣播,比如手機屏幕鎖屏或熄屏了、電量過低了或者圖片被捕獲了都會有相應的廣播。我們自己的app也可以創建一個廣播,比如通知其他app有數據被下載到設備上並且可以用了。儘管廣播不用提供用戶界面,但是他們可以在收到廣播後創建一個狀態欄通知去提醒用戶。

     

      Android系統的獨特新設計在於任何app都可以啓動其他app的組件。比如,如果你想用戶通過相機去捕獲一張圖片,而拍照時另一個app做的事情,但是是在你的app中使用的,這樣我們就可以避免自己重新創建相機去拍照了(當然自己也可以自定義相機),你只需要啓動一個在相機app的Activity就可以拍照並捕獲照片,當拍照完了之後,圖片就會返回到你的app供你使用,對於用戶來說,這個拍照過程彷彿是你的應用來完成似的。

      當系統啓動一個組件後,他就爲那個組件所在的應用啓動一個進程(如果他沒有運行的話),比如,如果在自己的app中啓動相機app的一個拍照Activity,那麼那麼Activity就會運行在相機app進程當中,而不是你自己的app進程中,因此,不像其他系統的qpp,Android APP沒有一個確定的入口,也沒有main()方法。
      由於每個app都運行在它單獨的進程之中並且文件系統權限也限制了去接近其他app。所以,你的app不能直接激活其它應用的組件,但是,你可以讓Android系統代勞,爲了激活另一個app的組件,你必須傳遞一個消息給系統去指定你想要啓動的那個組件,系統就可以爲你激活組件了。

三、激活組件

      四大組件中的三個組件--Activity、Service、BroadcastReceiver是可以通過調用Intent來激活的。Intent可以在運行時將彼此獨立的組件綁定連接起來(你可以認爲Intent是來自其他組件的作爲一個請求執行某種動作的信使),無論這些獨立的組件是自己的app還是其它的app。
       一個Intent對象定義了一個消息去激活另一個指定了的組件(Component)或指定的組件類型,這個intent可以是顯示的或隱式的。當我們直接指定組件名稱時就是顯示的intent、當我們只指定組件的類型(即Action等)時就是隱式的。
       對於Activity和Service來說,一個Intent定義了一個動作(View或send等)去執行並且也有可能是指定數據的URI。比如,一個Intent可能爲一個Activity會傳遞一個請求去展示圖片或打開網頁等。在有的情況下,你可以啓動一個Activity並且會收到結果,在這種情況下,Activity也是將結果放到Intent傳遞回來。
    對於BroadcastReceiver來說,Intent僅僅定義了將要被廣播出去的公告。
    其他的組件類型,比如ContentProvider就不是通過Intent來激活的,相反,他是當目標通過從ContentProvider請求時被激活。如下就是集中激活組件的方式:
   (1)激活Activity
    startActivity()和startActivityForResult()
   (2)激活Service
    startService()和bindService()
   (3)激活BroadCastReceiver
   sendBroadcastReceiver()、sendOrderBroadcast()、sendStickyBroadcast()
   (4)查詢ContentProvider數據
    ContentProvider的query()

     當然,所有的組件都必須在Manifestfile中註冊,否則在運行時就會報錯。

















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