㈠ Carson帶你學android:全面剖析Binder跨進程通信原理
從而全方位地介紹 Binder ,希望你們會喜歡。
在本文的講解中,按照 大角度 -> 小角度 去分析 Binder ,即:
從而全方位地介紹 Binder ,希望你們會喜歡。
在講解 Binder 前,我們先了解一些 Linux 的基礎知識
具體請看文章: 操作系統:圖文詳解 內存映射
Binder 跨進程通信機制 模型 基於 Client - Server 模式
此處重點講解 Binder 驅動作用中的跨進程通信的原理:
原因:
所以,原理圖可表示為以下:
所以,在進行跨進程通信時,開發者只需自定義 Client & Server 進程 並 顯式使用上述3個步驟,最終藉助 Android 的基本架構功能就可完成進程間通信
注冊服務後, Binder 驅動持有 Server 進程創建的 Binder 實體
此時, Client 進程與 Server 進程已經建立了連接
Client 進程 根據獲取到的 Service 信息( Binder 代理對象),通過 Binder 驅動 建立與 該 Service 所在 Server 進程通信的鏈路,並開始使用服務
步驟1: Client 進程 將參數(整數a和b)發送到 Server 進程
步驟2: Server 進程根據 Client 進要求 調用 目標方法(即加法函數)
步驟3: Server 進程 將目標方法的結果(即加法後的結果)返回給 Client 進程
對比 Linux ( Android 基於 Linux )上的其他進程通信方式(管道、消息隊列、共享內存、
信號量、 Socket ), Binder 機制的優點有:
特別地,對於從模型結構組成的Binder驅動來說:
不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度 。
㈡ android程序設計基礎中service的基本原理是什麼
1. 說明
android的後台運行在很多service,它們在系統啟動時被SystemServer開啟,支持系統的正常工作,比如MountService監聽是否有SD卡安裝及移除,ClipboardService提供剪切板功能,PackageManagerService提供軟體包的安裝移除及查看等等,應用程序可以通過系統提供的Manager介面來訪問這些Service提供的數據,以下將說明他們的工具流程
2. 舉例說明基本流程
以android系統支持sensor(感測器)實例來說明框架層的service和manager是如何配合工作的
1) 什麼是sensor
sensor是感測器, 比如控制橫豎屏切換利用的就是重力感測器(gsensor), 還有accelerator sensor可取得x, y, z三個軸上的加速度(應用如平衡球, 小猴吃香蕉等)
2) 應用程序調用(以下為關鍵代碼)
sensorManager=(SensorManager)getSystemService(context.SENSOR_SERVICE);
lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(sensorListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
3) Manager層
a) 提供給應用程序調用的介面,同實與Service交互,實現功能
frameworks/base/core/java/android/hardware/SensorManager.java
4) Service層
a) 開機時就運行的管理Sensor的後台服務
frameworks/base/services/java/com/android/server/SensorService.java
b) snesor後台服務需要的JNI,通過它與系統級交互
frameworks/base/services/jni/com_android_server_SensorService.cpp
5) 系統層
a) 感測器的頭文件,硬體提供商按此文件的定義實現其功能
hardware/libhardware/include/hardware/sensors.h
b) 感測器的系統層實現,與內核交互,此處通常是硬體提供商提供的
hareware/libsensors
6) 內核及硬體層
內核訪問硬體,同時以設備文件等方式提供給上層控制介面和感測器數據
3. 系統層實現
1) frameworks/base/core/java/android/*Manager.java 對應用的介面
2) frameworks/base/core/jni/ 對應用的介面的JNI
3) frameworks/base/services/java/com/android/server/ 後台服務
4) frameworks/base/services/jni/ JNI與系統層介面
5) hardware/libhardware/include/ 系統層頭文件
6) hardware/libxxx 系統庫支持
7) 內核支持
4. 應用程序如何使用
1) 查看系統提供哪些服務
find frameworks/base/core/java/android/ -name *Manager.java
此處可以看到調用系統提供服務的入口
2) 一般register listener,事件發生時都收到回調
5. 新建一個service(以froyo為例)
1) 介面:介面供應用調用
frameworks/base/core/java/android/app/ContextImpl.java 加服務名與Manager對應
frameworks/base/core/java/android/content/Context.java 加服務名定義
2) Manager:提供服務對應的調用介面
frameworks/base/core/java/android/app/StartXXXXManager.java 實現調用介面
frameworks/base/core/java/android/app/IXXXXManager.aidl 定義調用介面
frameworks/base/Android.mk 加入aidl的編譯
3) service:提供後台服務支持
frameworks/base/services/java/com/android/server/XXXXService.java 服務實現
frameworks/base/services/java/com/android/server/SystemServer.java 啟動服務
㈢ 安卓 service 基本原理及用途、求大神指教,當成簡答題回復下。搜了半天沒有。
Service(服務)是一種能夠在後台長期運行且不提供用戶界面的應用程序組件。通常Service用來執行一些耗時操作,或者後台執行不提供用戶交互界面的操作,例如:下載、播放音樂。
㈣ Android中怎麼啟動關閉Service及功能解釋
調用startService就是啟動service,調用stopService就是關閉service。
android中Service是運行在後台的東西,級別與activity差不多。既然說service是運行在後台的服務,那麼它就是不可見的,沒有界面的東西。可以啟動一個服務Service來播放音樂,或者記錄地理信息位置的改變,或者啟動一個服務來運行並一直監聽某種動作。Service和其他組件一樣,都是運行在主線程中,因此不能用它來做耗時的請求或者動作。
服務一般分為兩種:
1:本地服務, Local Service 用於應用程序內部。在Service可以調用Context.startService()啟動,調用Context.stopService()結束。在內部可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。無論調用了多少次startService(),都只需調用一次stopService()來停止。
2:遠程服務, Remote Service 用於android系統內部的應用程序之間。可以定義介面並把介面暴露出來,以便其他應用進行操作。客戶端建立到服務對象的連接,並通過那個連接來調用服務。調用Context.bindService()方法建立連接,並啟動,以調用 Context.unbindService()關閉連接。多個客戶端可以綁定至同一個服務。如果服務此時還沒有載入,bindService()會先載入它。
㈤ Android N 四大組件的工作原理
本文側重講解android N 系統中四大組件的工作原理,不同系統原理略有差別。通過分析四大組件的工作流程加深對Android Framework的理解,也為插件化開發打下基礎。
Activity
展示一個界面並和用戶交互,它扮演的是一個前台界面的角色。
Service
計算型組件,用於後台執行一系列計算任務,工作在主線程,耗時操作需要另起線程, 分為啟動狀態和綁定狀態。
BroadcastReceiver
消息型組件,主要用於不同組件或者不同應用之間的消息傳遞,它工作在系統內部,不適合執行耗時操作,操作超過5s,會出現ANR。
ContentProvider
數據共享型組件,用於向其他組件或者應用共享數據,主要執行CURD操作。
我們啟動一個activity有兩種方法,
第一種(Activity直接啟動方式):
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
第二種(Context啟動方式)
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);
不同的啟動方式Activity的工作流程有點差別。
兩種啟動都會調用到Instrumentation類中的execStartActivity的方法,系統最終是通過ActivityThread中的performLaunchActivity完成Activity的創建和啟動。
performLaunchActivity方法主要完成以下工作:
1、通過ActivityClientRecord對象獲取啟動activity的組件信息
2、通過mInstrumentation對象的newActivity方法調用classloader完成activity的創建
3、通過r.packageInfo(LoadedApk 對象)的makeApplication方法嘗試創建Application對象
4、創建ContextImpl對象並調用Activity的attach方法完成一些數據的初始化
5、調用Activity的onCreate方法
在Activity啟動的過程中,App進程會頻繁地與AMS進程進行通信:
App進程會委託AMS進程完成Activity生命周期的管理以及任務棧的管理;這個通信過程AMS是Server端,App進程通過持有AMS的client代理IActivityManager完成通信過程;
AMS進程完成生命周期管理以及任務棧管理後,會把控制權交給App進程,讓App進程完成Activity類對象的創建,以及生命周期回調;這個通信過程也是通過Binder完成的,App所在server端的Binder對象存在於ActivityThread的內部類ApplicationThread;AMS所在client通過持有IApplicationThread的代理對象完成對於App進程的通信。
Service有兩種啟動方式,startService()和bindService(),兩種狀態可以並存:
startService流程
bindService流程
BroadcastReceiver的工作過程主要包括廣播的注冊、發送和接收:
動態注冊過程:
發送過程
靜態注冊是由PackageManagerService(PMS)在應用安裝的時候完成整個注冊過程的,除廣播以外,其他三大組件也都是在應用安裝時由PMS解析並注冊的。
每個進程的入口都是ActivityThead.main(),App的啟動流程如下:
從源碼中可以看出:
應用啟動的入口為ActivityThread的main方法,main方法會創建ActivityThread實例並創建主線程消息隊列。
attach方法中遠程調用AMS的attachApplication方法,並提供ApplicationThread用於和AMS的通信。
attachApplication方法會通過bindApplication方法和H來調回ActivityThread的handleBindApplication,這個方法會先創建Application,再載入ContentProvider,然後才會回調Application的onCreate方法。
由上圖可以看出,在ContentProvider的啟動過程中伴隨著app進程的啟動。
ContentProvider的其他CURD操作如insert,delete,update跟query的流程類似。
㈥ 安卓運行機制是什麼 安卓手機的工作原理是什麼
android基於Linux內核,很多系統也都基於Linux內核。但是android的特別之處除了開發上的特點以外,還有一個就是程序在運行時的行為和以往我接觸到的程序運行機制有很大不同。在傳統PC機或者其他一些手機上,用戶對應用程序有絕對的掌控權,在應用程序的系統菜單上選擇「退出」或者「關閉」之類的選項會直接殺死進程,而在android系統中不是這樣的。在android中,應用程序的生命周期並不是由應用程序自身直接控制的,而是由系統,當系統需要釋放內存來運行新進程或者保證某些後台進程和前端進程順利執行的時候才會釋放相應應用程序的資源,這個釋放過程有一個重要性的層次。
android中進程的層次如下(重要性由高到低):
1、前端進程。顧名思義,前端進程就是目前顯示在屏幕上和用戶交互的進程,在系統中前端進程數量很少,而這種進程是對用戶體驗的影響最大,只有系統的內存稀少到不足以維持和用戶的基本交互時才會銷毀前端進程。因此這種進程重要性是最高的。
2、可見進程。可見進程也擁有一個可視化的界面,只是目前不是最上層界面(最上層界面在前端進程裡面),可見進程一般調用了OnPause(),可見進程比前端進程重要性低,但是在交互方面影響還是很大,因為用戶可能隨時切換過去,所以系統不會輕易銷毀它。
3、服務進程。一個服務進程就是一個Service,它調用了startService,就是UNIX中說的守護進程,對用戶不可見,但是保證了一些重要的事件被監聽或者維持著某些狀態,比如網路數據傳輸、後台音樂播放,這類進程在內存不足且為了保證前端交互的順利進行的時候被銷毀。
4、後台進程。這里叫後台進程可能會和一般意義上的後台進程混淆,要說明的是,android里的後台進程是調用了OnStop()的,可以理解成用戶暫時沒有和這個進程交互的願望,所以這里後台進程有點「待銷毀」的意思。
5、空進程。這是一種系統緩存機制,其實就是個進程的外殼,當有新進程創建的時候,這個空進程可以加快進程創建速度,當系統內存不足的時候,首先銷毀空進程。
android中進程重要性層次
㈦ AndroidService是什麼
Service就是一個應用程序組件,用來執行一些長時間的操作,然而不與用戶交互或者為其他應用程序提供一些功能。每一個Service類都必須定義在AndroidManifest.xml中,以<service>tag開頭。