Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 從源碼的角度理解四大組件的工作過程——Android開發藝術探索筆記

從源碼的角度理解四大組件的工作過程——Android開發藝術探索筆記

編輯:關於Android編程

系統對四大組件的過程進行了很大程度的封裝,日常開發中並不需要了解底層的工作原理,那麼研究這些原理的意義在哪裡呢?

如果你想在技術上更進一步,那麼了解一些系統的工作原理是十分必要的,也是開發人員日後成長為高級工程師所必備的技術能力。 Android作為一個優秀的基於Linux操作系統,其內部一定有很多值得我們學習的地方,通過對Android操作系統的學習對提高開發人員的內功有很大的好處。 如果你從事Android Rom開發,那就沒什麼好說的了,看源碼吧。

本文側重於對四大組件工作過程的分析,通過分析他們的工作過程理解系統內部運行機制,加深我們對Android整體系統結構的認識。

Android相關部分的源碼實在是太多,全部貼上了太過繁瑣,所以借用了amurocrash同學的UML圖使得整個流程更加容易理解。

四大組件的運行狀態

Activity的主要作用是展示一個界面並和用戶交互,它扮演的是一種前台界面的角色。 Service是一種計算型組件,用於在後台執行一系列計算任務。Service有兩種狀態:啟動狀態和綁定狀態。啟動狀態時的Service不需要與外界交互,綁定狀態的Service可以方便的和Service組件進行通信。Service是運行在主線程中的,因此耗時的後台計算仍然需要在單獨的線程中去完成。靈活采用stopService和unBindService這兩個方法才能完全停止一個Service組件。 BroadcastReceiver是一種消息型組件,用於在不同的組件乃至不同的應用之間傳遞消息。廣播注冊有靜態和動態兩種方式,動態注冊通過Context.registerReceiver()來實現,不需要時通過Contex.unRegisterReceiver()來解除廣播,這種方式必須要應用啟動才能注冊;靜態注冊則在AndroidManifest文件中進行,應用安裝時會被系統解析,不需要啟動應用就可接收廣播。匹配過程是通過來描述的。 ContentProvider是一種共享型組件,用於向其他組件乃至其他應用共享數據。它內部維持著一份數據集合,並需要實現增刪改查這四種操作,這個數據集合既可以通過數據庫來實現,也可以采用其他類型來實現,比如List,Map等。需要注意的是,增刪改查要處理好線程同步,這幾個方法是在Binder線程池中被調用的,另外,ContentProvider不需要手動停止。

Activity的工作過程

UML圖

注<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCsb0tq9BY3Rpdml0ebXE1ebKtcq1z9bKx9PJQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5zdGFydEFjdGl2aXR5t723qMC0zeqzybXEoaPV4rj2t723qLe1u9hBY3Rpdml0eU1hbmFnZXJTZXJ2aWNloaMgQWN0aXZpdHlNYW5hZ2VyU2VydmljZaOoQU1To6m8zLPQ19RBY3Rpdml0eU1hbmFnZXJOYXRpdmWjrLb4QWN0aXZpdHlNYW5hZ2VyTmF0aXZlvMyz0NfUQmluZGVysqLKtc/WwctJQWN0aXZpdHlNYW5hZ2Vy1eK49kJpbmRlcr3Tv9qjrNLytMtBTVPSssrH0ru49kJpbmRlcqGjIEFNU9XiuPZCaW5kZXK21M/zssnTw7WlwP3Eo8q9ttTN4szhuamjrLXa0ru0zrX308PL/LXEZ2V0t723qMqxu+HNqLn9Y3JlYXRlt723qLP1yry7r6OsuvPQ+LX308PW0NaxvdO3tbvY1q7HsLS0vai1xLbUz/OhoyC0021ha2VBcHBsaWNhdGlvbrXEyrXP1r/J0tS/tLP2o6zI57n7QXBwbGljYXRpb27S0b6tsbu0tL2ouf3By6OsxMfDtL7Nsru74dTZ1ti4tLS0vaijrNXi0rLS4s6218XSu7j206bTw9a709DSu7j2QXBwbGljYXRpb2621M/zoaNBcHBsaWNhdGlvbrXEtLS9qNKyysfNqLn9SW5zdHJ1bWVudGF0aW9uwLTN6rPJtcSjrNXiuPa5/bPMus1BY3Rpdml0ebbUz/O1xLS0vai5/bPM0rvR+aOstrzKx82ouf3A4LzT1NjG98C0yrXP1rXEoaMgQ29udGV4dEltcGzKx0NvbnRleHS1xL7fzOXKtc/Wo6xDb250ZXh0SW1wbMrHzai5/UFjdGl2aXR5tcRhdHRhY2i3vbeowLS6zUFjdGl2aXR5vajBornYwaq1xKOs1NphdHRhY2i3vbeo1tBBY3Rpdml0ebu5u+HN6rPJV2luZG93tcS0tL2osqK9qMGi19S8urrNV2luZG93tcS52MGqo6zV4tH5tbFBY3Rpdml0eb3Tyty1vcrCvP6+zb/J0tS0q7XduPh3aW5kb3fBy6GjDQo8aDEgaWQ9"service的工作過程">Service的工作過程

啟動過程

啟動過程

綁定過程
這裡寫圖片描述

- Service有兩種狀態:啟動狀態和綁定狀態,兩種狀態是可以共存的。

BroadcastReceiver的工作過程

BroadcastReceiver的工作過程包括廣播注冊過程、廣播發送和接收過程。
動態注冊
這裡寫圖片描述

發送接收
這裡寫圖片描述

注:

靜態注冊是由PackageManagerService(PMS)在應用安裝的時候完成整個注冊過程的,除廣播以外,其他三大組件也都是在應用安裝時由PMS解析並注冊的。 廣播的發送有幾種類型:普通廣播、有序廣播和粘性廣播,有序廣播和粘性廣播與普通廣播相比具有不同的特性,但是發送和接收過程是類似的。 FLAG_INCLUDE_STOPPED_PACKAGES:廣播會發送給已經停止的應用,FLAG_EXCLUDE_STOPPED_PACKAGES廣播不會發送給已經停止的應用 從Android 3.1開始,處於停止狀態的應用無法接受到開機廣播。

ContentProvider

啟動過程

這裡寫圖片描述

當ContentProvider所在的進程啟動時,會同時被啟動並被發布到AMS中,需要注意的是,這個時候它的onCreate要先去Application的onCreate執行,這在四大組件中是一個少有的現象。 用啟動的入口為ActivityThread的main方法,main方法會創建ActivityThread實例並創建主線程消息隊列。 attach方法中遠程調用AMS的attachApplication方法,並提供ApplicationThread用於和AMS的通信。 attachApplication方法會通過bindApplication方法和H來調回ActivityThread的handleBindApplication,這個方法會先創建Application,再加載ContentProvider,然後才會回調Application的onCreate方法。 ContentProvider的multiprocess屬性決定了ContentProvider是否是單例(false時),一般都用單例。 ontentResolver的具體類是ApplicationContentResolver,當ContentProvider所在進程未啟動時,第一次訪問它會觸發ContentProvider的創建以及進程啟動。

Query流程

這裡寫圖片描述

insert,delete和update方法類似,這裡就不在分析了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved