安卓哪個框架有用線程池
1. 安卓框架有哪些
問題一:Android常用的框架有哪些 Android開發中常用的框架:
1、Afinal
Afinal是一個android的ioc,orm框架,內置了四大模塊功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通過finalActivity,可以通過註解的方式進行綁定ui和事孝戚歷件。通過finalBitmap,可以方便的載入bitmap圖片,而無需考慮oom等問題。通過finalDB模塊,一行代碼就可以對android的sqlite資料庫進行增刪改查。通過FinalHttp模塊,以ajax形式請求數據。
2、 xUtils
xUtils:可以說是Afinal的升級版。
xUtils 包含了很多實用的android工具。
xUtils 支持大文件上傳,更全面的請求協議支持(10種謂詞),擁有更加靈活的ORM,更多的事件註解支持且不受混淆影響。
xUitls 最低兼容android 2.2 (api level8)。
3、LoonAndroid
這是一個純實現功能的框架,它的目標是節省代碼量,降低耦合,讓代碼層次看起來更清晰。
4、 KJFrameForAndroid
是一個android的orm 和 ioc 框架。同時封裝了android中的Bitmap與Http操作的框架,使其更加簡單易用;
KJFrameForAndroid的設計思想是通過封裝Android原生SDK中復雜的復雜操作而達到簡化Android應用級開發,最終實現快速而又安全的開發APP。我們提倡用最少的代碼,完成最多的操作,用最高的效率,完成最復雜的功能。
項目地址:github/kymjs/KJFrameForAndroid
5、 dhroid
dhroid 是基於android 平台, 極速開發框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能仔或強大、輕量級、易擴展.使你更快,更好的開發商業級別應用。
6、 SmartAndroid
SmartAndroid是一套給 Android開發者使用的應用程序開發框架和工具包。提供了一套豐富的標准庫以及簡單的介面和邏輯結構,其目的是使開發人員更快速地進行項目開發。使用 SmartAndroid可以減少代碼的編寫量,並將你的精力投入到項目的創造性開發上。
7、 andBase
ndbase是為Android開發者量身打造的一款開源類庫產品
8、 AndroidAnnotations
完全的註解,使開發起來更加便利,程序員寫的代碼也更少。
9、 volley
Volley是Android平台上的網路通信庫,能使網路通信更快,更簡單,更健壯非同步載入網路圖片、網路數據,Google官方推薦。
問題二:安卓軟體開發框架有哪些 安卓軟體開發需要一定的java基礎,當然少不了Java環境的搭建,還有安卓SDK的環境搭建,接著你下個eclipse裝個ADT插件,或者直接用Android studio就可以開發安卓應用了,具體的建議你找個開發教程
問題三:android有哪些實用框架?分別用來做什麼? Android 目前還沒有那樣成熟的框架可以使用……
只能說有一些開源項目較好地解決了部分方面的問題,例如:
(1)EventBus:解決了模塊之間消息傳遞解耦合的問題
(2)picasso:解決非同步載入圖片和緩存圖片的問題
(3)dagger:一個依賴注入工具庫
……
其他開巧搜源項目大多數解決了部分通用 UI 控制項的問題,不過我看你的意思是架構級別的框架,而不是什麼 UI 控制項這類的小東西。
問題四:什麼是android的框架開發 上圖中的第二層Framework
問題五:常用的android開發框架有哪些 android bootstrap有試用過,但其實不用框架都能完成你想要的功能的話,真心沒必要用。
問題六:Android的系統架構包括哪些部分 Android的系統架構和其操作系統一樣,採用了分層的架構。Android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux內核層。
一、應用程序
Android會同一系列核心應用程序包一起發布,該應用程序包包括客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。所有的應用程序都是使用JAVA語言編寫的。
二、應用程序框架
開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發布它的功能塊並且任何其它的應用程序都可以使用其所發布的功能塊(不過得遵循框架的安全性)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。
三、系統運行庫
Android 包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過 Android 應用程序框架為開發者提供服務。
四、Linux內核層
Android內核是基於Linux 內核的修改的內核版本,它提供了用於支持Android平台的設備驅動。
問題七:android快速開發框架有哪些 ThinkAndroid免費源、簡易、遵循Apache二源協議發布Android發框架其發宗旨簡單、快速進行Android應用程序發包含Android mvc、簡易sqlite orm、ioc模塊、封裝Android clitent模塊,具快速構建文件緩存功能需考慮緩存文件格式都非輕松實現緩存基於文件緩存模塊實現圖片緩存功能android載入圖片候oom問題載入圖片錯位問題都輕易解決包括手機發經應用實用工具類志管理配置文件管理android載器模塊中國絡切換檢測等等工具 目前ThinkAndroid主要模塊: MVC模塊:實現視圖與模型離 ioc模塊:androidioc模塊完全註解式進行UI綁定、res資源讀取、及象初始化 資料庫模塊:androidorm框架使用線程池sqlite進行操作 模塊:通client進行封裝數據請求支持非同步及同步式載入 緩存模塊:通簡單配置及設計實現緩存緩存隨意配置 圖片緩存模塊:imageview載入圖片候需考慮圖片載入程現oomandroid容器快速滑候現圖片錯位等現象 配置器模塊:簡易實現配配置操作目前配置文件支持Preference、Properties配置進行存取 志列印模塊:較快輕易實現志列印支持志列印擴展目前支持sdcard寫入本列印、及控制台列印 載器模塊:簡單實現線程載、台載、斷點續傳、載進行控制、始、暫停、刪除等等 中國絡狀態檢測模塊:中國絡狀態改變中國絡狀態進行檢
問題八:主流android開發框架有哪些 android開發框架github上有非常非常多,各種都是開源的,例如側滑菜單,ImageLoading等等。
問題九:Android 有哪些著名的開源框架呢? 什麼應用才對應什麼所謂框架。你寫個游戲用J2EE的框架試試。或者你寫個搜索引擎用游戲引擎試試。沒有哪個框架解決所有問題,如果那樣,搞計算機也太簡單了,框架拿來,隨便改改就是一個軟體。還是學點設計模式這些基本的有用。
問題十:Android軟體框架結構自可分為哪些層? 開發一個程序,android的系統框架是層層相扣,不能分開的。
應用程序層:
這個層主要指的就是用java語言編寫的運行在虛擬機上的程序,Google在最開始時就 在android系統中捆綁了一些核心的應用(核心應用的編寫必須使用應用層序框架層的API框架),例如你android手機中SMS發送短消息的程序,通訊錄等等。
應用程序框架層:
指的就是開發時所需要的API框架,開發人員是在遵守該框架的原則上,調用他們的,開發自己所需要的程序。
系統運行庫層:
用於支持應用框架層的各個組件的。就是說當開發人員使用android應用框架層時,android系統會通過一些C/C++庫來支持對我們使用的各個組件,使其能更好地為開發者服務。
linux核心層:
android的核心系統服務如安全性、內存管理、進程管理、網路協議棧和驅動模型等都依賴於Linux2.6內核,Linux內核同時也作為硬體和軟體棧之間的抽象層。
因此,你開發的程序是運行在應用程序層,開發中寫代碼調用的包,是基於應用框架層,而在應用框架中的各個組件是需要系統運行庫的支持的,例如,你要登陸查看的信息就必須訪問到SQLite資料庫,SQLite就位於系統運行庫,再有,你登入要輸入信息,肯定需要鍵盤驅動的支持,而各種驅動是依賴Linux內核的。
2. 開發android app有什麼架構嗎
主要有以下模塊:
(1) JSON,圖像等的非同步下載;
(2) 網路請求的排序(scheling)
(3) 網路請求的優先順序處理
(4) 緩存
(5) 多級別取消請求
(6) 和Activity和生命周期的聯動(Activity結束時同時取消所有網路請求)2、android-async-http
主要有以下模塊:
(1) 在匿名回調中處理請求結果
(2) 在UI線程外進行http請求
(3) 文件斷點上傳
(4) 智能重試
(5) 默認gzip壓縮
(6) 支持解析成Json格式
(7) 可將Cookies持久化到SharedPreferences 3、Afinal框架
主要有四大模塊:
(1) 資料庫模塊:android中的orm框架,使用了線程池對sqlite進行操作。
(2) 註解模塊:android中的ioc框架,完全註解方式就可以進行UI綁定和事件綁定。無需findViewById和setClickListener等。
(3) 網路模塊:通過httpclient進行封裝http數據請求,支持ajax方式載入,支持下載、上傳文件功能。
(4) 圖片緩存模塊:通過FinalBitmap,imageview載入bitmap的時候無需考慮bitmap載入過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象。4、xUtils框架
主要有四大模塊:
(1) 資料庫模塊:android中的orm框架,一行代碼就可以進行增刪改查;
(2) 註解模塊:android中的ioc框架,完全註解方式就可以進行UI,資源和事件綁定;
(3) 網路模塊:支持同步,非同步方式的請求;
(4) 圖片緩存模塊:載入bitmap的時候無需考慮bitmap載入過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象;5、ThinkAndroid主要有以下模塊:(1) MVC模塊:實現視圖與模型的分離。
(2) ioc模塊:android中的ioc模塊,完全註解方式就可以進行UI綁定、res中的資源的讀取、以及對象的初始化。
(3) 資料庫模塊:android中的orm框架,使用了線程池對sqlite進行操作。
(4) http模塊:通過httpclient進行封裝http數據請求,支持非同步及同步方式載入。
(5) 緩存模塊:通過簡單的配置及設計可以很好的實現緩存,對緩存可以隨意的配置
(6) 圖片緩存模塊:imageview載入圖片的時候無需考慮圖片載入過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象。
(7) 配置器模塊:可以對簡易的實現配對配置的操作,目前配置文件可以支持Preference、Properties對配置進行存取。
(8) 日誌列印模塊:可以較快的輕易的是實現日誌列印,支持日誌列印的擴展,目前支持對sdcard寫入本地列印、以及控制台列印
(9) 下載器模塊:可以簡單的實現多線程下載、後台下載、斷點續傳、對下載進行控制、如開始、暫停、刪除等等。
(10) 網路狀態檢測模塊:當網路狀態改變時,對其進行檢6、LoonAndroid 主要有以下模塊:
(1) 自動注入框架(只需要繼承框架內的application既可)
(2) 圖片載入框架(多重緩存,自動回收,最大限度保證內存的安全性)
(3) 網路請求模塊(繼承了基本上現在所有的http請求)
(4) eventbus(集成一個開源的框架)
(5) 驗證框架(集成開源框架)
(6) json解析(支持解析成集合或者對象)
(7) 資料庫(不知道是哪位寫的 忘記了)
(8) 多線程斷點下載(自動判斷是否支持多線程,判斷是否是重定向)
(9) 自動更新模塊
(10) 一系列工具類
3. kotlin協程有哪些應用場景
作者:J船長
一、協程:掛起與恢復,讓非同步像同步的核心概念
想像一下,你正在看一部非常引人入勝的電影,但是突然你想上廁所。你難道會錯過電影中精彩的部分嗎?當然不會。你會「暫停」電影,上完廁所再「恢復」播放。這就是協程的核心概念:掛起與恢復。你可以把協程想像成一個大廚,他正在烹飪多道菜品。當一個菜品需要等待一段時間(比如煮沸或烘烤)時,大廚不會傻傻地等待,而是轉向另一個任務。這就是協程的核心思想:掛起與恢復。
什麼時候,需要用到協程?
協程,輕量級的線程管理工具。什麼時候用到? ——執行非同步任務 和 管理並發操作。
最經典的場景
最經典的,無非就是,多個網路請求,一起執行,讓這些本來都是非同步的代碼,像同步一樣地執行。
二、 協程的依賴
安卓項目中使用協程,先添加依賴
build.gradle 引入一下
三、先從最經典的場景說起
假設,有一個頁面,需要用Retrofit,請求2個介面,當且僅當兩個介面都請求成功時,匯總數據返回,更新UI。
其中,一個介面請求用戶詳情,一個介面請求文章數據,一個類用於匯總數據。
定義我們的數據類和API介面:創建Retrofit實例ViewModel中處理非同步請求在Activity中使用
上面代碼,大概看個印象,可以看下下面的分析,也可以直接跳到第四大點。
上面的代碼,到底講了什麼
我們對這個使用 Kotlin 協程的網路請求例子做一個分析和總結。這個例子展示了如何使用 Kotlin 協程來處理並行的非同步任務,並通過 LiveData 對象將結果返回到 UI。Kotlin 協程提供了一種簡潔的方式來管理非同步操作,避免了回調地獄,使代碼更易於閱讀和維護。此外,通過正確使用viewModelScope,我們可以確保在 ViewModel 被清除時取消所有的協程,從而避免了內存泄露。
四、協程,正式開打
協程離不開的4個東西
巴拉巴拉一堆名詞。
寫個最簡單的協程代碼,然後圈出來看一下。
瞭然瞭然一下
最簡單的協程代碼
那麼,誰是 掛起函數function ?作用域Scope? 上下文Context? 構建器Build?
Emmm,F4的第一次見面,結束。
五、協程的作用域 CoroutineScope
CoroutineScope作用域這玩意,必須先講,不然如果是剛入門的同學,可能會因為沒先了解這個東西,整的雲里霧里。GlobalScope這個作用域,它不會阻止 JVM 結束運行,這意味著!!!!!很可能JVM都結束了,你的協程還在運行,然後問題就來了,你在代碼裡面寫了一些輸出語句,然後你死等,就等不到你的輸出語句被列印出來。然後一臉懵逼,二臉懵逼,懵山懵海。盡量別用它
幾個作用域作用域的開發場景代碼典型的應用場景
GlobalScope: 幾乎不用
CoroutineScope: 常用
MainScope
viewModelScope 常用
lifecycleScope 常用
runBlocking
其實,對於開發初步使用
看到這里,基本也就夠了。
當然,但是,接著說,也是可以的!
六、協程的構造器 CoroutineBuilder
其實吧,這個東西,有點模糊。官方只說了launch和async是CoroutineBuilder。但是對於 runBlocking 和 coroutineScope,它們同時具有作用域和構造器的特性,但是我們這里,不把他們當做構造器,只認為 launch 和 async 是構造器。
協程的兩個啟動方法launch 和 async 的對比
launch 和 async 都是用來創建新協程的構造器。它們的主要區別在於返回值和目的。
Job 和 Deferred 的對比
Job 和 Deferred 都代表一個協程的生命周期和狀態。它們的主要區別在於,Deferred 可以有一個結果。
launch 和 async 代碼演示
這備注,可以說是相當詳細了吧。
關於協程的構造器,可以了
七、協程的上下文
在 Android 開發中,以下幾個協程上下文是比較常用的:
Dispatchers.Main
1.Dispatchers.Main:在主線程上執行協程代碼,用於處理 UI 相關的操作,例如更新界面、響應用戶交互等。在 Android 中,由於 UI 操作必須在主線程上執行,因此使用 Dispatchers.Main 是非常常見的。(由於協程在主線程中執行,不應該在該上下文中進行耗時操作,以免阻塞主線程導致應用無響應。)
Dispatchers.IO
2. Dispatchers.IO:用於執行 I/O 相關的操作,如網路請求、文件讀寫等。它使用了一個線程池來運行協程代碼,適用於執行長時間的阻塞操作。在進行網路請求、資料庫操作或文件讀寫等 I/O 操作時,使用 Dispatchers.IO 可以避免阻塞主線程,提高應用程序的響應性。
Dispatchers.Default
2.Dispatchers.Default:用於執行計算密集型操作,如數據處理或計算。它使用了一個線程池來運行協程代碼,適用於執行消耗 CPU 資源的任務。當需要進行復雜的計算或處理大量數據時,使用 Dispatchers.Default 可以將這些操作分配到後台線程,避免阻塞主線程。
除了上述常用的協程上下文,還有一些其他的上下文也可能在特定的場景中使用:
Dispatchers.Unconfined
3.Dispatchers.Unconfined:這個上下文不受任何特定線程的限制,協程會在恢復後恢復到任意線程上。它適用於一些無需特定線程限制的操作,但需要注意的是,由於協程在不同的線程之間切換,可能會導致上下文切換的開銷。
CoroutineName
4.CoroutineName:這個上下文用於為協程指定一個名稱,以方便調試和追蹤。在復雜的協程流程中,給協程命名可以幫助我們更好地理解和跟蹤協程的執行路徑。
在 Android 開發中,常用的協程上下文是根據具體的需求和場景選擇的。主要關注需要在主線程上執行的 UI 操作、I/O 操作和計算密集型操作,並根據需要選擇適當的協程上下文。
也就是說,日常使用基本都是Dispatchers.Main, Dispatchers.IO,Dispatchers.Default
Dispatchers.Main示例
Dispatchers.IO:
Dispatchers.Default:
八、協程 恢復和掛起
掛起(suspend)和恢復(resume)是協程的兩個核心操作。
簡單來說:
我們可以把協程想像成一部正在播放的電影。當你需要離開一會(比如接個電話),你可能會按下"暫停"按鈕,這就是掛起協程。當你准備好繼續觀看時,你會按下"播放"按鈕,這就是恢復協程。
誰可以調用掛起函數
在 Kotlin 協程中,掛起函數只能在以下環境中被調用:
掛起suspend 函數的小例子
看代碼吧
我們前面說過,delay()本身也是一個掛起函數
在上面的代碼中,launch函數啟動了一個新的協程,並在內部調用了delay(1000L)。這個delay函數就是一個掛起函數,它會暫停協程的執行1秒鍾(但不會阻塞線程),然後恢復協程的執行。
這段代碼的輸出將是:
我們看到,輸出順序是 開始 —— 繼續 ——恢復。
注意觀察,雖然我們的協程在等待時,主線程並沒有被阻塞,而是繼續執行了下一行代碼。協程的暫停並不會阻塞線程。
再來一個例子
列印輸出:
常見的掛起函數
被 suspend 修飾的函數就是掛起函數,協程也自帶一些掛起函數
協程的掛起函數有許多,比如delay,join,await,withContext,yield,withTimeout 等等。這些函數的作用和特點如下:
以下是一個例子,結合 Android 的 Activity,演示如何使用這些函數:
單獨演示下常用的 withContext
輸出
emm,基本寫到這里的話,日常開發也夠用了。不寫了太長了這個文章
番外篇 協程到底是不是在單線程里並發?還是不多線程?
協程可能在單線程,也可能是多線程。具體要取決於Dispatcher
協程本身並不直接與線程對應,它是一種輕量級的線程,可以在單個線程內並發執行,也可以在多個線程之間切換。一個協程可以在一個線程中啟動,然後在另一個線程中暫停,然後再在另一個線程中恢復。
具體來說,協程的運行取決於它的調度器(Dispatcher)。調度器決定了協程在哪個線程或哪些線程上執行。比如 Dispatchers.Main 是主線程調度器,Dispatchers.IO 是專門用於磁碟和網路 IO 讀寫的調度器,Dispatchers.Default 是用於 CPU 密集型任務的調度器,Dispatchers.Unconfined 是一個特殊的調度器,它沒有特定的線程,會在當前線程立即執行協程,如果協程中有掛起點,它會在恢復時繼續在其他合適的線程執行。
總的來說,協程既可以在單線程中並發運行,也可以在多線程中運行,取決於你的需求和使用的調度器。但是,與線程相比,協程更輕量級,可以創建成千上萬個而不會對性能造成大的影響。
來例子啊
在單線程內並發運行多個協程
這個例子中,我們在主線程中啟動了兩個協程,它們會並發執行,但都在同一個線程內。
在多線程之間切換協程:
這個例子中,我們首先在主線程中啟動了一個協程,然後使用withContext(Dispatchers.IO) 切換到了 IO 線程,然後又回到了主線程。我們可以在日誌中看到協程在不同的線程之間切換。
Kotlin+協程已經讓我們在網路編程中體會到了它的過人之處。為了能讓大家能夠順暢的使用Kotlin語言,這為大家准備了《Kotlin開發學習指南》的核心筆記: qr18.cn/CdjtAF
Android Kotlin 學習指南
概述
Kotlin 基礎包括操作、編碼習慣與習慣用法
基礎部分: qr18.cn/CdjtAF
類與對象
函數與 Lambda 表達式: qr18.cn/CdjtAF
4. 安卓開發需要學習什麼
學習分三個階段:
1,Android基礎階段:平台架構特性(JAVA/C) Market/應用程序組件 環境搭建與部署/打包與發布 AVD/DDMS/AAPT 調試與測試 相關資源訪問/資源製作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及深層實現
2,Android進階初級:組件Widget/ 菜單Menu/ 布局Layout 詳解 Xml解析(Pull/Dom/Sax)/JNI 解析SQL資料庫原理,。
SQLite /SharedPreferences/File詳解 多媒體Audio/Video/Camera 詳解
3,Android進階高級:藍牙/WIFI SMS/MMS 應用實現 深層次解析GPS原理。
實現LocationManager/LocationProvider 進行定位/跟蹤/查找/趨近警告以及Geocoder正逆向編解碼等技術細節 2D圖形庫(Graphics/View)詳解 SDCARD/感測器/手勢 應用實現
(4)安卓哪個框架有用線程池擴展閱讀:
知識體系
1、Unix/Linux平台技術:基本命令,Linux下的開發環境
2、企業級資料庫技術:SQL語言、SQL語句調優、Oracle資料庫技術
3、Java 語言核心技術:Java語言基礎、Java面向對象編程、JDK核心API、Java集合框架、Java網路編 程、JavaI/O編程、Java多線程編程、Java異常機制、Java安全、JDBC、XML
4、軟體工程和設計模式:軟體工程概述、配置管理及SVN、UML、基本設計模式
5、Android應用開發基礎:Android開發平台、Eclipse+ADT開發環境、AVD及感測模擬器調試、Android核心組件、Android常用組件、Android高級組件、文件及網路訪問、SQLite資料庫編程、後台服務編程
6、互聯網核心技術: HTML、CSS、JavaScript、JQuery、Ajax應用
7、Android高級應用開發:音頻視頻攝像頭、互聯網應用、GPS和位置服務、Google Map、2D3D繪制、感測器開發、游戲開發、電話及SMS服務、網路BluetoothWi-Fi等。
8、Android系統級開發:移植、驅動、NDK(C方向)。
9、JavaEE核心技術:Servlet核心技術、JSP核心技術、Struts、Spring、Hibernate框架。
5. 瀹夊崜鍥涘ぇ緇勪歡鍙婂叾浣滅敤
瀹夊崜鍥涘ぇ緇勪歡錛欰ctivity銆丼ervice銆丅roadcastReceiver鍜孋ontentProvider錛屼綔鐢錛
銆銆1銆丄ctivity緇勪歡鐨勪富瑕佷綔鐢ㄦ槸灞曠ず涓涓鐣岄潰騫跺拰鐢ㄦ埛浜や簰錛屽畠鎵婕旂殑鏄涓縐嶅墠鍙扮晫闈㈢殑瑙掕壊
銆銆Activity鏄涓縐嶅睍紺哄瀷緇勪歡錛屼富瑕佹槸鍚戠敤鎴峰睍紺轟竴涓鐣岄潰錛屽苟涓斿彲浠ユ帴鏀剁敤鎴風殑杈撳叆淇℃伅浠庤屽拰鐢ㄦ埛榪涜屼氦浜掋傚圭敤鎴鋒潵璇達紝Activity灝辨槸Android搴旂敤鐨勫叏閮錛屽洜涓哄叾浠栦笁澶х粍浠跺圭敤鎴鋒潵璇存槸涓嶅彲鎰熺煡鐨勩侫ctivity鐨勫惎鍔ㄧ敱Intent瑙﹀彂錛屽叾涓璉ntent鍒嗕負鏄懼紡鍚鍔ㄥ拰闅愬紡鍚鍔ㄣ
銆銆2銆丼ervice緇勪歡鐨勪富瑕佷綔鐢ㄦ槸鍦ㄥ悗鍙版墽琛岃$畻浠誨姟錛屾墽琛屼換鍔$殑緇撴灉鍙浠ュ拰澶栫晫榪涜岄氫俊
銆銆Service鏄涓縐嶈$畻鍨嬬粍浠訛紝鐢ㄤ簬鍦ㄥ悗鍙版墽琛屼竴緋誨垪璁$畻浠誨姟銆傜敱浜嶴ervice緇勪歡宸ヤ綔鍦ㄥ悗鍙幫紝鍥犳ょ敤鎴鋒棤娉曠洿鎺ユ劅鐭ュ埌瀹冪殑瀛樺湪銆係ervice緇勪歡鍜孉ctivity緇勪歡涓嶅悓錛孉ctivity緇勪歡鍙鏈変竴縐嶈繍琛屾ā寮忥紝鍗矨ctivity澶勪簬鍚鍔ㄧ姸鎬侊紝浣嗘槸Service緇勪歡鍗存湁涓ょ嶇姸鎬侊細鍚鍔ㄧ姸鎬佸拰緇戝畾鐘舵併係ervice緇勪歡澶勪簬鍚鍔ㄧ姸鎬佹椂錛屽畠鐨勫唴閮ㄥ彲浠ユ墽琛屼竴浜涘悗鍙拌$畻錛屽苟涓斾笉闇瑕佸拰澶栫晫鏈夌洿鎺ョ殑浜や簰銆係ervice澶勪簬緇戝畾鐘舵侊紝Service鍐呴儴鍚屾牱涔熷彲浠ユ墽琛屽悗鍙拌$畻錛屼絾鏄澶勪簬榪欑嶇姸鎬佺殑Service鍙浠ュ緢鏂逛究鍦板拰澶栫晫榪涜岄氫俊銆
銆銆3銆丅roadcastReceiver緇勪歡鐨勪富瑕佷綔鐢ㄦ槸娑堟伅鐨勪紶閫掞紝璇ユ秷鎮鐨勪紶閫掑彲浠ュ湪搴旂敤鍐咃紝涔熷彲浠ュ湪搴旂敤涔嬮棿錛屽畠鐨勮掕壊鏄涓涓娑堟伅鐨勪紶閫掕
銆銆BroadcastReceiver鏄涓縐嶆秷鎮鍨嬬粍浠訛紝鐢ㄤ簬鍦ㄤ笉鍚岀粍浠朵箖鑷充笉鍚屽簲鐢ㄤ箣闂翠紶閫掓秷鎮銆侭roadcastReceiver鍚屾牱鏃犳硶琚鐢ㄦ埛鎵鎰熺煡錛屽洜涓哄畠宸ヤ綔鍦ㄧ郴緇熷唴閮ㄣ侭roadcastReceiver涔熷彨鍋氬箍鎾錛屽箍鎾鐨勬敞鍐屾柟寮忔湁涓ょ嶏細闈欐佹敞鍐屽拰鍔ㄦ佹敞鍐屻傞潤鎬佹敞鍐屾寚鍦ˋndroidManifest涓娉ㄥ唽騫挎挱錛岃繖縐嶅箍鎾鍦ㄥ簲鐢ㄥ畨瑁呮椂琚緋葷粺瑙f瀽錛屾ょ嶅艦寮忕殑騫挎挱涓嶉渶瑕佸簲鐢ㄥ惎鍔ㄥ氨鍙浠ユ帴鏀跺埌鐩稿簲鐨勫箍鎾銆傚姩鎬佸箍鎾闇瑕侀氳繃Context.registerReceiver()鏉ュ疄鐜幫紝騫朵笖鍦ㄤ笉闇瑕佺殑鏃跺欓氳繃Context.unRegisterReceiver()瑙i櫎騫挎挱錛屾ょ嶅艦鎬佺殑騫挎挱蹇呴』瑕佸簲鐢ㄥ惎鍔ㄦ墠鑳芥敞鍐屽苟鎺ユ敹騫挎挱銆
銆銆4銆丆ontentProvider緇勪歡鐨勪富瑕佷綔鐢ㄦ槸浣滀負涓涓騫沖彴錛屾彁渚涙暟鎹鐨勫叡浜錛屽苟涓旀彁渚涙暟鎹鐨勫炲垹鏀規煡鍔熻兘銆備富瑕佸簲鐢ㄤ簬搴旂敤涔嬮棿鐨勬暟鎹鍏變韓鍦烘櫙
銆銆ContentProvider鏄涓縐嶆暟鎹鍏變韓鍨嬬粍浠訛紝鐢ㄤ簬鍚戝叾浠栫粍浠朵箖鑷沖叾浠栧簲鐢ㄥ叡浜鏁版嵁銆傚悓鏍風殑錛屽畠涔熸棤娉曡鐢ㄦ埛鎵鎰熺煡銆傚逛簬ContentProvider緇勪歡鏉ヨ達紝瀹冪殑鍐呴儴闇瑕佸疄鐜板炲垹鏀規煡榪欏洓縐嶆搷浣溿傞渶瑕佹敞鎰忕殑鏄錛孋ontentProvider鍐呴儴鐨刣elete銆乽pdate鍜宷uery鏂規硶闇瑕佸勭悊濂界嚎紼嬪悓姝ワ紝鍥犱負榪欏嚑涓鏂規硶閮芥槸鍦˙inder綰跨▼奼犱腑琚璋冪敤鐨勩侰ontentProvider緇勪歡涓嶉渶瑕佹墜鍔ㄥ仠姝銆
6. 結構型模式-安卓源碼實戰之的Proxy(代理)、Delegate(委託)
Proxy和Delegate的設計思想是相同的,可以一起討論。前面是代理模式的簡要介紹,後面是具體源碼實戰。
以下基礎知識摘抄自《設計模式-可復用面向對象軟體的基礎》Proxy章節
為其他對象提供一種代理以控制對這個對象的訪問
當創建某一具體對象RealSubject開銷很大時,應該根據需要進行創建,當真正需要到這個RealSubject對象時在進行創建,此時就需要用到代理Proxy 。
例如需要在文檔中嵌入 圖形對象的文檔編輯器功能 ,然而 創建圖形文檔編輯器的開銷很大也不是每一個文檔都需要用到圖形文檔編輯器 。所以我們使用另外一個對象(即圖像Proxy) 代替 真正的圖形文檔編輯器。 Proxy可以代替一個圖形文檔編輯器,並且在真正需要的時候負責實例化這個圖形文檔編輯器對象。
只有當文檔編輯器點擊 圖形文檔編輯器 代理Proxy的圖標以啟動功能時,圖形代理Proxy才創建真正的 圖形文檔編輯器 對象
上面說過,代理(委託)模式是為了避免直接創建開銷大的資源而不使用,採用的一種代理模式以便於真正使用時在實例化。
在 PhoneWindowManager 中使用 KeyguardServiceDelegate 來代理 KeyguardService 的功能( KeyguardService 由 KeyguardServiceWrapper 包裝器進行包裝)
PhoneWindowManager 需要使用到 KeyguardService 的功能,但是在創建 PhoneWindowManager 時就實例化 KeyguardService 沒必要且開銷大,因為還沒用到 KeyguardService 的功能。直接創建 KeyguardService 會浪費 binder線程池 資源,所以應該在需要使用的時候再創建,所以引入 KeyguardServiceDelegate 。
PhoneWindowManager 並沒有直接創建 KeyguardService 對象,而是創建了代理對象 KeyguardServiceDelegate 。 後面 PhoneWindowManager 需要使用到 KeyguardService 的功能時,通過調用 KeyguardServiceDelegate.bindService 將 KeyguardService 的 binder 對象轉化為 介面 封裝到 KeyguardServiceWrapper 包裝器,最後將 KeyguardServiceWrapper 賦值到 KeyguardServiceDelegate 的成員變數,完成整個代理模式的架構。
最終的方法調用流程:
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService
通過創建KeyguardServiceDelegate來避免直接創建KeyguardService而不使用帶來不必要的開銷。屬於延遲載入。
[SystemServer.java]
眾所周知SystemServer用來完成服務的創建和初始化過程。
一:WindowManagerService.main();啟動了WMS,可以看到new PhoneWindowManager()傳入WMS的main方法中,它將被賦值到成員變數WindowManagerPolicy mPolicy;
二:wm.onInitReady();調用WMS的init方法,這里是KeyguardServiceDelegate的創建流程
[WindowManagerService.java]
[WindowManagerService.java]
調用PhoneWindowManager.init方法
[PhoneWindowManager.java]
這里可以看到,在PhoneWindowManager.init函數中並沒有直接創建KeyguardService對象,而是創建了代理對象KeyguardServiceDelegate。在後面需要使用到KeyguardService的功能時,通過調用KeyguardServiceDelegate.bindService將KeyguardService的binder對象轉化為介面封裝到KeyguardServiceWrapper包裝器,最後將包裝器賦值給KeyguardServiceDelegate的成員變數
[KeyguardServiceDelegate.java]
[SystemServer.java]
[SystemServer.java]
[WindowManagerService.java]
mPolicy指的是WindowManagerPolicy。而PhoneWindowManager實現了WindowManagerPolicy介面。mPolicy的賦值在WMS的構造函數中就已經完成了。而WMS的啟動在systemServer中。
[PhoneWindowManager.java]
[PhoneWindowManager.java]
[PhoneWindowManager.java]
調用context.bindServiceAsUser(...)來綁定服務,重點關注以下幾點
通過指定ComponentName來綁定服務。可以看到KeyguardServiceDelegate所在包名為
/frameworks/base/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
尋找resources.getString(com.android.internal.R.string.config_keyguardComponent)的定義位置
[/frameworks/base/core/res/res/values/config.xml]
可以看到config_keyguardComponent對應啟動的就是 KeyguardService 這個服務。通過 ServiceConnection 去指定拿到 KeyguardService 後,將 KeyguardService 轉換為介面對象 IKeyguardService.Stub.asInterface(service) 來創建 KeyguardServiceWrapper 對象。看一看 KeyguardServiceWrapper 的創建過程
[KeyguardServiceWrapper.java]
可以看到將IKeyguardService service傳遞給了成員變數mService
ServiceConnection mKeyguardConnection 里通過 KeyguardService 的創建了代理對象 KeyguardServiceWrapper 。
後續當需要使用到 KeyguardService 功能是將是以下的調用過程
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService