Android -- getSystemService


說明                                                                                   

Android的后台運行在很多service,它們在系統啟動時被SystemServer開啟,支持系統的正常工作,比如MountService監聽是否有SD卡安裝及移除,ClipboardService提供剪切板功能,PackageManagerService提供軟件包的安裝移除及查看等等,應用程序可以通過系統提供的Manager接口來訪問這些Service提供的數據。

舉例說明基本流程                                                                   

以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) sensor后台服務需要的JNI,通過它與系統級交互

  frameworks/base/services/jni/com_android_server_SensorService.cpp

5) 系統層

  a) 傳感器的頭文件,硬件提供商按此文件的定義實現其功能

  hardware/libhardware/include/hardware/sensors.h

  b) 傳感器的系統層實現,與內核交互,此處通常是硬件提供商提供的

  hareware/libsensors

6) 內核及硬件層

  內核訪問硬件,同時以設備文件等方式提供給上層控制接口和傳感器數據

系統層實現                                                                            

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) 內核支持

應用程序如何使用                                                                    

1) 查看系統提供哪些服務

  find frameworks/base/core/java/android/ -name *Manager.java

  此處可以看到調用系統提供服務的入口

2) 一般register listener,事件發生時都收到回調

新建一個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 啟動服務

 

getSystemService是Android很重要的一個API,它是Activity的一個方法,根據傳入的NAME來取得對應的Object,然后轉換成相應的服務對象。以下介紹系統相應的服務。 

傳入的Name

返回的對象

說明

WINDOW_SERVICE

WindowManager

管理打開的窗口程序

LAYOUT_INFLATER_SERVICE

LayoutInflater

取得xml里定義的view

ACTIVITY_SERVICE

ActivityManager

管理應用程序的系統狀態

POWER_SERVICE

PowerManger

電源的服務

ALARM_SERVICE

AlarmManager

鬧鍾的服務

NOTIFICATION_SERVICE

NotificationManager

狀態欄的服務

KEYGUARD_SERVICE

KeyguardManager

鍵盤鎖的服務

LOCATION_SERVICE

LocationManager

位置的服務,如GPS

SEARCH_SERVICE

SearchManager

搜索的服務

VIBRATOR_SERVICE

Vibrator

手機震動的服務

CONNECTIVITY_SERVICE

Connectivity

網絡連接的服務

WIFI_SERVICE

WifiManager

Wi-Fi服務

TELEPHONY_SERVICE

TeleponyManager

電話服務

我是天王蓋地虎的分割線                                                            

 

 

參考:http://blog.sina.com.cn/s/blog_7cb2c5d50101c26t.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM