了解Android的多線程與多進程模型有助于我們對Android app的整個開發模型有更深的理解,這里記錄下一些理解與思考.
Android中的線程
對于初學java的人都知道thread
的概念,而到了android thread的概念變味了,出現了譬如service, asynctask, intent service, handler thread, async query loader, threadpool executor等紛繁復雜的概念, android對于線程的處理機制如下。
- 主線程
- 所有Android基礎組件均在指定進程的主線程中初始化
- 所有系統對于基礎組件的回調事件均在主線程中分發
- 組件中的系統回調方法在指定進程的主線程中執行
- 所有的基礎組件不應該在系統回調代碼中執行耗時操作
- 所有不能立即完成的操作都應該被放在非UI線程中執行
- 線程對象使用標準的java代碼來創建
- Android提供一些方便的類來管理線程:
- Looper作為
ThreadLocal
的單例變量用來循環處理消息隊列(MessageQueue
) - Handler提供消息/Runable的發送以及回調操作
- HandlerThread提供啟動擁有Looper線程的簡易方法
- Looper作為
針對不同的使用場景,在線程,線程池,handler等基礎上我們拓展了一些易用的線程處理組件:
android_multitasking.png
Android 中的進程
- 當應用的第一個組件需要被執行時,Android Framework會為此啟動一個有單線程(主線程,即UI線程)運行環境的Linux進程
- 當Android系統資源緊缺時會終止一些進程的執行
- 對于特定的Android組件<activity> <service> <receiver> <provider>,我們可以通過android:process來指定
它運行的進程- 每個組件可以運行在它所指定的進程中
- 一些組件會共享一個進程, 而其他的不在其中
- 不同application中的組件可以在同一個進程中執行
- 我們可以通過設置<application>的process屬性指定應用所有組件的默認運行進程
Android中的rpc
Android進程間通訊實際上可以看做2個進程中的線程消息傳遞,作為cs架構,其實現依賴binder機制
binder機制解析:
Paste_Image.png
分層示例
實例分析
進程間通訊binder機制client,server實現代碼示例:
git clone https://github.com/marakana/FibonacciBinderDemo.git
參考鏈接:
http://events.linuxfoundation.org/images/stories/slides/abs2013_gargentas.pdf
http://www.cubrid.org/blog/dev-platform/binder-communication-mechanism-of-android-processes/