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 啓動服務