Android源碼分析實錄

Android源碼分析實錄 pdf epub mobi txt 电子书 下载 2025

李忠良 著
想要找书就要到 求知書站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 清华大学出版社
ISBN:9787302393290
版次:1
商品编码:11675987
品牌:清华大学
包装:平装
开本:16开
出版时间:2015-04-01
用纸:胶版纸
页数:740
正文语种:中文

具体描述

編輯推薦

  (1)講解詳盡,深入底層。
  《Android源碼分析實錄》詳細講解瞭Android網絡開發的每一個知識點,為瞭更加說明原理,從深入底層開始,到頂層Java應用結束。即使菜鳥也能夠看懂並掌握。
  (2)大話模式,趣味性更強。
  《Android源碼分析實錄》采用詼諧、生動的大話模式講實例,在逼真的生活場景中學編程,區彆於傳統編程書的古闆,使讀者以快活的心情學習。將復雜的高深專業知識,以趣味性的語言講解齣來。
  (3)實例典型,提示豐富。
  《Android源碼分析實錄》中的實例都是最典型的,最能闡述知識點的應用。融閤瞭技術中所有的經典範例,加深讀者對知識的掌握。
  (4)高深內容的深層剖析,做到一一俱全。
  作為某項專業技術,用最閤理的篇幅詳細剖析瞭每個知識點,內容涉及瞭領域內的方方麵麵,可直接作為此領域的專業書籍。

內容簡介

  Android是一款服務於智能手機和平闆電腦等設備的操作係統,截止作者撰寫此書時為止,Android在智能手機操作係統市場中已經占有75%的份額。為瞭讓廣大讀者充分瞭解這款神奇的操作係統的架構原理,本書循序漸進地分析瞭Android係統核心源碼的基本知識。
  《Android源碼分析實錄》共分為15章,主要內容包括走進Android世界、硬件抽象層詳解、分析JNI(Java本地接口)層、Android內存係統分析、Android虛擬機係統詳解、IPC通信機製詳解、Zygote進程/System進程和應用程序進程、分析Activity組件、ContentProvider數據存儲、Broadcast(廣播)係統詳解、多媒體係統詳解、電源管理係統詳解、輸入係統驅動應用、藍牙係統詳解、網絡係統詳解等。
  《Android源碼分析實錄》幾乎涵蓋瞭Android源碼中的所有核心係統的內容,全書內容通俗易懂,適閤Android初學者、Android愛好者、Android底層開發人員、Android應用開發人員閱讀和學習,也可以作為相關培訓學校和大專院校相關專業的教學用書。

目錄

第1章 走進Android世界 1
1.1 Android係統的優勢 2
1.1.1 開源 2
1.1.2 強大的開發團隊的支持 2
1.1.3 開發人員的支持 2
1.2 Android係統架構介紹 3
1.2.1 底層操作係統層(Linux內核層) 4
1.2.2 庫(Libraries)和運行環境(Runtime) 4
1.2.3 應用程序框架(ApplicationFramework) 5
1.2.4 頂層應用程序(Application) 5
1.3 核心組件 5
1.3.1 Activity的界麵錶現 5
1.3.2 Intent和IntentFilters界麵切換 6
1.3.3 Service服務 6
1.3.4 用Broadcast IntentReceiver廣播 7
1.3.5 用Content Provider存儲 7
1.4 進程和綫程 7
1.4.1 什麼是進程 7
1.4.2 什麼是綫程 8
1.5 獲取Android 4.3源碼 8
1.5.1 在Linux係統中獲取Android源碼 8
1.5.2 在Windows平颱上獲取Android源碼 9
1.6 Android源碼結構分析 14
1.6.1 Android源碼的目錄結構 15
1.6.2 應用程序 16
1.6.3 應用程序框架 18
1.6.4 係統服務 19
1.6.5 係統程序庫 21
1.6.6 係統運行庫 24
1.6.7 硬件抽象層 25
1.7 編譯Android源碼 26
1.7.1 搭建編譯環境 27
1.7.2 開始編譯 27
1.7.3 在模擬器中運行 29
1.7.4 編譯源碼生成SDK 30
第2章 硬件抽象層詳解 35
2.1 什麼是HAL層 36
2.1.1 為什麼把對硬件的支持劃分為兩層來實現 36
2.1.2 HAL層的位置結構 36
2.2 分析HAL Module架構 38
2.2.1 hw_module_t 39
2.2.2 hw_module_methods_t 40
2.2.3 hw_device_t 40
2.3 分析文件hardware.c 41
2.3.1 函數hw_get_module 41
2.3.2 數組variant_keys 41
2.3.3 載入相應的庫 42
2.3.4 打開相應庫並獲得hw_module_t結構體 43
2.4 分析硬件抽象層的加載過程 44
2.5 分析硬件訪問服務 48
2.5.1 定義硬件訪問服務接口 48
2.5.2 實現硬件訪問服務 49
2.6 分析mokoid工程 50
2.6.1 直接調用Service方法實現 51
2.6.2 通過Manager調用Service實現 56
2.7 分析HAL層的具體實現(以Sensor係統為例) 59
2.7.1 傳感器係統的基礎知識 59
2.7.2 HAL層的Sensor代碼 60
2.7.3 Sensor編程的流程 61
第3章 分析JNI(Java本地接口)層 63
3.1 JNI基礎 64
3.1.1 JNI的層次結構 64
3.1.2 JNI的本質 64
3.1.3 與JNI相關的文件 65
3.2 分析Java層 66
3.2.1 加載JNI庫 66
3.2.2 實現掃描工作 68
3.2.3 讀取並保存信息 69
3.2.4 刪除不是SD卡中的文件信息 72
3.2.5 直接轉嚮JNI 72
3.2.6 掃描函數scanFile 73
3.2.7 異常處理 73
3.3 分析MediaScanner的JNI層 74
3.3.1 將Native對象的指針保存到Java對象 75
3.3.2 創建Native層的MediaScanner對象 75
3.4 分析MediaScanner的Native層 76
3.4.1 注冊JNI函數 76
3.4.2 完成注冊工作 78
3.4.3 動態注冊 80
3.4.4 處理路徑參數 82
3.4.5 掃描文件 83
3.4.6 添加TAG信息 83
3.4.7 JNIEnv接口 85
3.4.8 JNI中的環境變量 86
3.5 JNI實例分析(基於Camera係統) 87
3.5.1 Java層預覽接口 87
3.5.2 注冊預覽的JNI函數 89
3.5.3 C/C++層的預覽函數 92
第4章 Android內存係統分析 95
4.1 Android的進程通信機製 96
4.1.1 Android的進程間通信(IPC)機製Binder 96
4.1.2 Service Manager是Binder機製的上下文管理者 97
4.2 分析Ashmem驅動程序 98
4.2.1 基礎數據結構 98
4.2.2 初始化處理 99
4.2.3 打開匿名共享內存設備文件 101
4.2.4 內存映射 104
4.2.5 讀寫操作 105
4.2.6 鎖定和解鎖 107
4.2.7 迴收內存塊 113
4.3 分析C++訪問接口層 115
4.3.1 接口MemoryHeapBase 115
4.3.2 接口MemoryBase 125
4.4 分析Java訪問接口層 128
4.5 內存優化機製 132
4.5.1 sp和wp簡析 132
4.5.2 詳解智能指針 134
4.5.3 輕量級指針 136
4.5.4 強指針 139
4.5.5 弱指針 153
第5章 Android虛擬機係統詳解 159
5.1 Android虛擬機基礎 160
5.1.1 Android虛擬機源碼目錄 160
5.1.2 Dalvik的架構 161
5.1.3 Dalvik虛擬機的主要特徵 163
5.1.4 Dalvik的進程管理 163
5.1.5 Android的初始化流程 163
5.2 分析Dalvik的運作流程 164
5.2.1 Dalvik虛擬機相關的可執行程序 164
5.2.2 初始化Dalvik虛擬機 167
5.2.3 啓動Zygote 186
5.2.4 啓動SystemServer進程 190
5.2.5 加載class類文件 193
5.3 Dalvik VM的內存係統 197
5.3.1 如何分配內存 197
5.3.2 分析內存管理機製的源碼 199
5.4 分析Dalvik VM的啓動過程 211
5.4.1 創建一個Dalvik VM實例 211
5.4.2 指定控製選項 212
5.4.3 創建並初始化Dalvik VM實例 220
5.4.4 創建JNIEnvExt對象 223
5.4.5 設置當前進程 229
5.4.6 注冊Android核心類的JNI方法 229
5.4.7 使用綫程創建javaCreateThreadEtc鈎子 233
5.5 創建Dalvik VM進程 233
5.5.1 分析底層啓動過程 234
5.5.2 創建Dalvik VM進程 234
5.5.3 初始化運行的Dalvik VM 238
第6章 IPC通信機製詳解 241
6.1 Binder機製概述 242
6.2 分析Binder驅動程序 243
6.2.1 分析數據結構 243
6.2.2 分析設備初始化 255
6.2.3 打開Binder設備文件 257
6.2.4 內存映射 258
6.2.5 釋放物理頁麵 264
6.2.6 分配內核緩衝區 264
6.2.7 釋放內核緩衝區 267
6.2.8 查詢內核緩衝區 269
6.3 Binder封裝庫 270
6.3.1 Binder庫的實現層次 270
6.3.2 類BBinder 271
6.3.3 類BpRefBase 274
6.3.4 類IPCThreadState 275
6.4 初始化Java層Binder框架 279
第7章 Zygote進程、System進程和應用程序進程 283
7.1 Zygote(孕育)進程詳解 284
7.1.1 Zygote基礎 284
7.1.2 分析Zygote的啓動過程 285
7.2 System進程詳解 303
7.2.1 啓動System進程前的準備工作 303
7.2.2 分析SystemServer 304
7.2.3 分析EntropyService 308
7.2.4 分析DropBoxManagerService 310
7.2.5 分析DiskStatsService 318
7.2.6 分析DeviceStorageManagerService 323
7.2.7 分析SamplingProfilerService 326
7.3 應用程序進程詳解 336
7.3.1 創建應用程序 336
7.3.2 啓動綫程池 347
7.3.3 創建信息循環 348
第8章 分析Activity組件 351
8.1 Activity基礎 352
8.1.1 Activity的狀態 352
8.1.2 Activity的主要函數 353
8.2 啓動Activity 355
8.2.1 Launcher啓動應用程序 356
8.2.2 返迴ActivityManagerService的遠程接口 358
8.2.3 解析intent的內容 359
8.2.4 分析檢查機製 363
8.2.5 執行Activity組件的操作 378
8.2.6 將Launcher推入Paused狀態 386
8.2.7 處理消息 388
8.2.8 報告暫停 389
8.2.9 建立雙嚮連接 394
8.2.10 啓動新的Activity 400
8.2.11 發送通知信息 403
第9章 Content Provider數據存儲 405
9.1 Content Provider基礎 406
9.1.1 Content Provider在應用程序中的架構 406
9.1.2 Content Provider的常用接口 407
9.2 啓動Content Provider 408
9.2.1 獲得對象接口 408
9.2.2 存在校驗 410
9.2.3 啓動Android應用程序 416
9.2.4 根據進程啓動Content Provider 416
9.2.5 處理消息 422
9.2.6 具體啓動 423
9.3 Content Provider數據共享 427
9.3.1 獲取接口 427
9.3.2 創建CursorWindow對象 430
9.3.3 數據傳遞 433
9.3.4 處理進程通信的請求 436
9.3.5 數據操作 442
第10章 Broadcast(廣播)係統詳解 447
10.1 Broadcast基礎 448
10.2 發送廣播信息 448
10.2.1 intent描述指示 449
10.2.2 傳遞廣播信息 449
10.2.3 封裝傳遞 450
10.2.4 處理發送請求 451
10.2.5 查找廣播接收者 451
10.2.6 處理廣播信息 455
10.2.7 檢查權限 464
......










精彩書摘

  第1章
  走進Android世界
  Android係統於2007年誕生,是一款建立在Linux內核之上的智能設備係統,是一款經典的手機、平闆電腦等移動設備的軟件解決方案。從2011年下半年開始到現在,Android係統在全球智能手機操作係統中的占有率一直位居第一。
  本章將簡單介紹Android係統的發展曆程和背景,讓讀者瞭解Android係統的發展之路,充分體驗這款無與倫比的操作係統。
  1.1Android係統的優勢
  為什麼Google的Android(安卓)係統能夠在短短4年內超越瞭Symbian(塞班)、Blackberry
  (黑莓)、iOS等前輩,從一名後起之秀變為移動智能設備市場占有率的大佬?這需要從Android係統的優勢談起,在本節的內容中,將為讀者展示這些優勢。
  1.1.1開源
  Google的Android齣身於Linux世傢,是一款開源的手機操作係統。正因為如此,在Android嶄露頭角之後,各大手機廠商和電信部門紛紛加入到瞭Android聯盟中。這個聯盟由業界內的公認大佬組成,主要成員包括Google、中國移動、摩托羅拉、高通和T-Mobile等在內的30多傢技術和無綫應用的領軍企業。Android通過與運營商、設備製造商、開發商和其他有關各方結成深層次的閤作夥伴關係,希望通過建立標準化、開放式的移動電話軟件平颱,在移動産業內形成一個開放式的生態係統。
  開源意味著對開發人員和手機廠商來說,Android是完全無償免費使用的。正是因為源代碼公開的原因,所以吸引瞭全世界各地無數程序員的熱情。於是很多手機廠商都紛紛采用Android作為自己産品的係統,這當然也包括很多山寨廠商。因為免費,所以降低瞭成本,因而提高瞭利潤。而對於開發人員來說,因為Android被眾多移動設備産品所采用,所以這方麵的人纔也變得愈發搶手。於是有一些在彆的係統上乾得還可以的程序員也改行做Android開發,紛紛加入到Android開發大軍中來,原因是待遇更好;另外,也有很多混得不盡如人意的程序員更是紛紛改行做Android手機開發,目的是想尋找自己程序員生涯的轉機。
  而像本書作者這樣遇到發展瓶頸的程序員,後來也決定做Android開發,因為這樣可以學習一門新的技術,使自己的未來更加有保障。
  1.1.2強大的開發團隊的支持
  Android的研發隊伍陣容強大,包括Google、摩托羅拉、HTC(宏達電子)、Philips、T-Mobile、高通、魅族、三星、LG以及中國移動在內的34傢企業,這些企業都基於Android平颱開發手機的新型業務,並使應用之間的通用性和互聯性在最大程度上得到保持。從硬件到軟件開發機構,再到電信服務商,Android從一開始便成為業界內的寵兒,被當作新秀而重點培養,在強大的開發團隊的培育和嗬護下,順利地功成名就,成為一方霸主。
  1.1.3開發人員的支持
  Google一直視程序員為前進的動力和源泉,為瞭提高程序員們的開發積極性,不但為開發人員提供瞭一流的開發裝備和軟件服務,而且還提齣瞭振奮人心的奬勵機製。
  具體的開發人員支持主要體現在如下三個方麵。
  (1)可以迅速步入Android應用開發。在Android平颱上,程序員可以開發齣各式各樣的應用。Android應用程序是通過Java語言開發的,隻要具備Java開發基礎,就能很快地上手並掌握。對於單獨的Android應用開發來說,並沒有很高的Java編程門檻,即使沒有編程經驗的門外漢,也可以在突擊學習Java之後很快掌握Android編程。另外,Android完全支持2D、3D和數據庫,並且與瀏覽器實現瞭集成。所以,通過Android平颱,程序員可以迅速、高效地開發齣絢麗多彩的應用,例如常見的工具、管理程序、互聯網程序和遊戲程序等。
  (2)可以參加奬金豐厚的Android大賽。為瞭吸引更多的用戶使用Android開發,Google定期舉辦奬金為數韆萬美元的開發者競賽,鼓勵開發人員做齣創意十足的軟件。這種大賽對於開發人員來說,不但能磨練自己的開發水平,並且高額奬金本身也是吸引學習的動力。
  (3)可以加入自由經營的貿易市場。為瞭能讓Android平颱吸引更多的關注,Google提供瞭一個專門下載Android應用的門店:AndroidMarket,網址是https://play.google.com/store。在這個門店裏麵,允許開發人員發布應用程序,也允許Android用戶下載自己喜歡的程序。作為開發者,需要申請開發者賬號,申請後纔能將自己的程序上傳到AndroidMarket,並且可以對自己的軟件進行定價。隻要你的軟件程序足夠吸引人,就可以獲得很好的迴報。學習和賺錢兩不誤,我們何樂而不為呢?
  1.2Android係統架構介紹
  Android是一個移動設備的開發平颱,其軟件層次結構大體上包括操作係統(OS)、中間件(Middleware)和應用程序(Application)。
  Android操作係統的組件結構如圖1-1所示。
  圖1-1Android操作係統的組件結構
  根據Android操作係統的組件結構框圖可知,其軟件層次結構自下而上分為4層。
  (1)操作係統層(即Linux內核層)。
  (2)各種庫(Libraries)和Android運行環境(Runtime)。
  (3)應用程序框架(ApplicationFramework)。
  (4)應用程序(Application)。
  1.2.1底層操作係統層(Linux內核層)
  因為Android源於Linux,使用瞭Linux內核,所以Android使用Linux2.6作為操作係統。Linux2.6是一種標準的技術,Linux也是一個開放的操作係統。Android對操作係統的使用包括核心和驅動程序兩部分,Android的Linux核心為標準的Linux2.6內核,Android更多的是需要一些與移動設備相關的驅動程序。主要的驅動程序如下所示。
  ?顯示驅動(DisplayDriver):是常用的基於Linux的幀緩衝(FrameBuffer)驅動程序。
  ?Flash內存驅動(FlashMemoryDriver):是基於MTD的Flash驅動程序。
  ?照相機驅動(CameraDriver):常用基於Linux的V4L(VideoforLinux)驅動程序。
  ?音頻驅動(AudioDriver):常用基於ALSA(AdvancedLinuxSoundArchitecture,高級Linux聲音體係)的驅動程序。
  ?Wi-Fi驅動(Wi-FiDriver):基於IEEE802.11標準的驅動程序。
  ?鍵盤驅動(KeyboardDriver):作為輸入設備的鍵盤驅動程序。
  ?藍牙驅動(BluetoothDriver):基於IEEE802.15.1標準的無綫傳輸技術驅動程序。
  ?BinderIPC驅動:具有單獨的設備節點,提供進程間通信功能的特殊驅動程序。
  ?PowerManagement(電源管理):用於管理電池電量等信息的驅動程序。
  1.2.2庫(Libraries)和運行環境(Runtime)
  本層次對應一般的嵌入式係統,相當於中間件層次。Android的本層次分成兩個部分,一個是各種庫,另一個是Android運行環境。本層的內容大多是使用C語言實現的,其中包含瞭如下所示的各種庫。
  ?C庫:C語言的標準庫,也是係統中一個最為底層的庫,C庫是通過Linux的係統調用實現的。
  ?多媒體框架(MediaFramework):這部分內容是Android多媒體的核心部分,基於PacketVideo(即PV)的Opencore,從功能上看,本庫分為兩大部分,一部分是音頻、視頻的迴放(PlayBack),另一部分是則是音視頻的記錄(Recorder)。
  ?SGL:2D圖像引擎。
  ?SSL:即SecureSocketLayer,位於TCP/IP協議與各種應用層協議之間,為數據通信提供安全支持。
  ?OpenGLES:提供瞭對3D的支持。
  ?界麵管理工具(SurfaceManagement):提供管理顯示子係統等功能。
  ?SQLite:一個通用的嵌入式數據庫。
  ?WebKit:網絡瀏覽器的核心。
  ?FreeType:位圖和矢量字體的功能。
  在一般情況下,Android的各種庫是以係統中間件的形式提供的,它們的顯著特點是與移動設備平颱的應用密切相關。
  另外,Android的運行環境主要是基於Dalvik(虛擬機)技術的。而Dalvik與一般的Java虛擬機(JavaVirtualMachine,JVM)是有如下區彆的。
  ?Java虛擬機:執行的是Java標準的字節碼(Bytecode)。
  ?Dalvik:執行的是Dalvik可執行格式(.dex)的文件。在執行的過程中,每一個應用程序即一個進程(Linux的一個Process)。
  二者最大的區彆在於,JVM是基於棧的虛擬機(Stack-based),而Dalvik是基於寄存器的虛擬機(Register-based)。顯然,後者最大的好處在於可以依據硬件實現更大的優化,這更適閤移動設備的特點。
  1.2.3應用程序框架(ApplicationFramework)
  在整個Android係統中,與應用開發最相關的是ApplicationFramework,在這一層,Android為應用程序層的開發者提供瞭各種功能強大的APIs,這實際上是一個應用程序的框架。由於上層的應用程序是以Java構建的。在本層提供瞭程序中所需要的各種控件,例如:Views(視圖組件)、List(列錶)、Grid(柵格)、TextBox(文本框)、Button(按鈕),甚至還有一個嵌入式的Web瀏覽器。
  一個基本的Android應用程序可以利用應用程序框架中的以下5個部分。
  ?Activity:活動。
  ?BroadcastIntentReceiver:廣播意圖接收者。
  ?Service:服務。
  ?ContentProvider:內容提供者。
  ?IntentandIntentFilter:意圖和意圖過濾器。
  1.2.4頂層應用程序(Application)
  Android的應用程序主要是用戶界麵(UserInterface)方麵的,本層通常使用Java語言編寫,其中還可以包含各種被放置在“res”目錄中的資源文件。Java程序和相關資源在經過編譯後,會生成一個APK包。Android本身提供瞭主屏幕(Home)、聯係人(Contact)、電話(Phone)、瀏覽器(Browsers)等眾多的核心應用。同時,應用程序的開發者還可以使用應用程序框架層的API實現自己的程序。這也是Android開源的巨大潛力的體現。
  注意:我們目的是分析Android係統的源碼,因為涉及的知識麵涵蓋瞭所有上述4個層次,所以學習過程任重而道遠。
  1.3核心組件
  一個典型的Android程序通常由5個組件組成,這5個組件構成瞭Android的核心功能。在分析Android4.3源碼之前,本節將詳細講解Android應用程序的核心組件的基本知識。
  1.3.1Activity的界麵錶現
  Activities是這5個組件中最常用的一個組件。程序中Activity通常的錶現形式是一個單獨的界麵(screen)。每個Activity都是一個單獨的類,它擴展實現瞭Activity基礎類。這個類顯示為一個由Views組成的用戶界麵,並響應事件。大多數程序有多個Activity。例如,一個文本信息程序有這麼幾個界麵:顯示聯係人列錶界麵、寫信息界麵、查看信息界麵或者設置界麵等。每個界麵都是一個Activity。切換到另一個界麵就是載入一個新的Activity。某些情況下,一個Activity可能會給前一個Activity返迴值——例如,一個讓用戶選擇相片的Activity會把選擇到的相片返迴給其調用者。
  打開一個新界麵後,前一個界麵就被暫停,並放入曆史棧中(界麵切換曆史棧)。使用者可以迴溯前麵已經打開的存放在曆史棧中的界麵。也可以從曆史棧中刪除沒有界麵價值的界麵。Android在曆史棧中保留程序運行産生的所有界麵:從第一個界麵,到最後一個。
  1.3.2Intent和IntentFilters界麵切換
  Android通過一個專門的Intent類來進行界麵的切換。Intent描述瞭程序想做什麼(Intent意為意圖,目的,意嚮)。Intent類還有一個相關類IntentFilter。Intent是一個請求,用來明確做什麼事情,IntentFilter則描述瞭一個Activity(或下文的IntentReceiver)能處理什麼意圖。顯示某人聯係信息的Activity使用瞭一個IntentFilter,就是說,它知道如何處理應用到此人數據的VIEW操作。Activities在文件AndroidManifest.xml中使用IntentFilters。
  通過解析Intents可以實現Activity的切換,我們可以使用startActivity(myIntent)啓用新的Activity。係統會考察所有安裝程序的IntentFilters,然後找到與myIntent匹配最好的IntentFilters所對應的Activity。這個新Activity能夠接收Intent傳來的消息,並因此被啓用。解析Intents的過程發生在startActivity被實時調用時,這樣做有如下兩個好處:
  ?Activities僅發齣一個Intent請求,便能重用其他組件的功能。
  ?Activities可以隨時被替換為有等價IntentFilter的新Activity。
  1.3.3Service服務
  Service是一個沒有用戶界麵(UI)且長駐係統的代碼,最常見的例子是媒體播放器從播放列錶中播放歌麯。在媒體播放器程序中,可能有一個或多個Activities讓用戶選擇播放的歌麯。然而在後颱播放歌麯時無需Activity乾涉,因為用戶希望在音樂播放的同時能夠切換到其他界麵。既然這樣,媒體播放器Activity需要通過Context.startService()啓動一個Service,這個Service在後颱運行以保持繼續播放音樂。在媒體播放器被關閉之前,係統會保持音樂後颱播放Service的正常運行。可以用Context.bindService()方法連接到一個Service上(如果Service未運行的話,連接後還會啓動它),連接後就可以通過一個Service提供的接口與Service進行通話。對音樂Service來說,提供瞭暫停和重放等功能。
  Android係統將會嘗試保留那些啓動瞭的或者綁定瞭的服務進程,具體說明如下。
  (1)如果該服務正在進程的onCreate()、onStart()或者onDestroy()這些方法中執行,那麼主進程將會成為一個前颱進程,以確保此代碼不會被停止。
  (2)如果服務已經開始,那麼它的主進程的重要性會低於所有的可見進程,但是會高於不可見進程。由於隻有少數幾個進程是用戶可見的,所以,隻要不是內存特彆低,該服務就不會停止。
  (3)如果有多個客戶端綁定瞭服務,隻要客戶端中的一個對於用戶是可見的,就可以認為該服務可見。
  1.3.4用BroadcastIntentReceiver廣播
  當要執行一些與外部事件相關的代碼時,比如來電響鈴時,或者到半夜時,就可能用到IntentReceiver。盡管IntentReceivers使用NotificationManager來通知用戶一些好玩事情的發生,但沒有用戶界麵。
  IntentReceivers可以在文件AndroidManifest.xml中聲明,也可以用Context.registerReceiver()來聲明。當一個IntentReceiver被觸發時,如果需要,係統自然會自動啓動程序。程序也可以通過Context.broadcastIntent()來發送自己的Intent廣播給其他程序。
  1.3.5用ContentProvider存儲
  在Android係統中,應用程序將數據存放在一個SQLite數據庫格式的文件裏,或者存放在其他有效設備裏。如果想讓其他程序能夠使用我們程序中的數據,此時ContentProvider就很有用瞭。ContentProvider是一個實現瞭一係列標準方法的類,這個類使得其他程序能存儲、讀取某種ContentProvider可處理的數據。
  1.4進程和綫程
  在Android係統中,進程和綫程用於完成某個Android任務。當第一次運行某個組件的時候,Android會啓動一個進程。在默認情況下,所有的組件和程序運行在這個進程和綫程中,也可以安排組件在其他的進程或者綫程中運行。在本節的內容中,將簡要介紹Android係統中進程和綫程的基本知識。
  1.4.1什麼是進程
  組件運行的進程是由manifest文件控製的。組件的節點一般都包含一個process屬性,例如、、和節點。
  屬性process可以設置組件運行的進程,可以配置組件在一個獨立進程中運行,或者多個組件在同一個進程中運行,甚至可以讓多個程序在一個進程中運行,當然前提是這些程序共享一個UserID並給定同樣的權限。另外,節點也包含瞭process屬性,用來設置程序中所有組件的默認進程。
  當更加常用的進程無法獲取足夠的內存時,Android會智能地關閉不常用的進程。當下次啓動程序的時候,會重新啓動這些進程。
  當決定哪個進程需要被關閉的時候,Android會考慮進程對用戶是否還有用。例如Android會傾嚮於關閉一個長期不顯示在界麵的進程來支持一個經常顯示在界麵的進程。是否關閉一個進程,決定於組件在進程中的狀態。
  1.4.2什麼是綫程
  當用戶界麵需要快速對用戶操作進行響應時,就需要將一些費時的操作,如網絡連接、下載或者非常占用服務器時間的操作等放到其他綫程中。也就是說,即使為組件分配瞭不同的進程,有時候也需要再分配綫程。
  綫程是通過Java的標準對象Thread來創建的,在Android中提供瞭如下管理綫程的方法。
  (1)Looper可用來在綫程中運行一個消息循環。
  (2)Handler可用來傳遞一個消息。
  (3)HandlerThread可用來創建一個帶有消息循環的綫程。
  (4)Android讓一個應用程序在單獨的綫程中,直到它創建自己的綫程。
  (5)應用程序組件(Activity、Service、BroadcastReceiver)全都在理想的主綫程中實例化。
  (6)當被係統調用時,任何組件都不應該執行長時間或是阻塞的操作(例如網絡調用或是計算循環),否則應該中斷所有在該進程中的其他組件。
  (7)可以創建一個新的綫程來執行長期操作。
  1.5獲取Android4.3源碼
  在分析Android4.3的源碼之前,需要先獲取其源碼。因為目前市麵上的主流操作係統是Windows、Linux和MacOS,由於MacOS屬於類Linux係統,所以本節將講解在Windows係統和Linux係統中獲取Android源碼的知識。
  1.5.1在Linux係統中獲取Android源碼
  在Linux係統中,通常使用Ubuntu來下載和編譯Android源碼。由於Android的源碼內容很多,Google采用瞭git的版本控製工具,並對不同的模塊設置不同的git服務器,我們可以用repo自動化腳本來下載Android源碼,下麵介紹如何一步一步地獲取Android源碼的過程。
  (1)下載repo
  在用戶目錄下,創建bin文件夾,用於存放repo,並把該路徑設置到環境變量中去,命令如下:
  $mkdir~/bin
  $PATH=~/bin:$PATH
  下載repo的腳本,用於執行repo,命令如下:
  $curlhttps://dl-ssl.google.com/dl/googlesource/git-repo/repo>~/bin/repo
  設置可執行權限,命令如下:
  $chmoda+x~/bin/repo
  (2)初始化一個repo的客戶端
  在用戶目錄下,創建一個空目錄,用於存放Android源碼,命令如下:
  $mkdirAndroidCode
  $cdAndroidCode
  進入到AndroidCode目錄,並運行repo來下載源碼,下載主綫分支的代碼,主綫分支包括最新修改,以及並未正式發齣版本的最新源碼,命令如下:
  $repoinit-uhttps://android.googlesource.com/platform/manifest
  下載其他分支,即正式發布的版本,可以通過添加-b參數來下載,命令如下:
  $repoinit-uhttps://android.googlesource.com/platform/manifest-b
  android-4.2_r1
  ……

用户评价

评分

学习学习,就是快递急着送,订的时间是19点到22点,下班时间方便取的,非要提前送。已经好几次了。快递没好评

评分

嗯,很厚,可枕头。

评分

现在不学习,工资就加不起来

评分

很不错,很不错,很不错,很不错

评分

还不错还不错还不错还不错

评分

好书,看这个可以接一些关于源码的bug了

评分

不建议小白买这本书学习。

评分

查阅方便很实用性价比高科技前沿

评分

很实用,讲的还算比较具体。但是安卓版本有点老。

相关图书

本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有