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

來源:互聯網
上載者:User

從源碼的角度理解四大組件的工作過程——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的工作過程

注<喎?http://www.bkjia.com/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方法類似,這裡就不在分析了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.