建立一個系統的Service,能通過ServiceManager.getService取得service

very_on發表於2018-04-19
Java層service顧名思義即為從 Java層提供的service,它與 C++層的服務不同之處在於其service程式的執行由系統( ServiceManager)統一維護。在檔案 frameworks/base/services/java/com/android/server/SystemServer.java 中我們可以看到以下程式碼:
AlarmManagerService alarm = new AlarmManagerService (context );
ServiceManager.addService (Context.ALARM_SERVICE alarm );

這個操作在系統啟動時完成,由 ServiceManager 負責建立服務程式並執行之。所以我們要做的事就是實現一個 java 服務,並將其新增到這裡並由系統執行起來,以下是具體實現步驟:

1. 在目錄frameworks/base/core/java/android/os中增加自己的 AIDL檔案用來申明服務:
BelyService.aidl:

[java] view plain copy
  1. package android.os;  
  2. interface IBelyService {  
  3.     int calculateSqu(int value);  
  4. }  

2.在目錄frameworks/base/services/java/com/android/server增加 service的實現檔案:

BelyService.java:

[java] view plain copy
  1. package com.android.server;  
  2.    
  3. import android.content.Context;  
  4.    
  5. import android.os.IBelyService;  
  6.    
  7. public class BelyService extends IBelyService.Stub {  
  8.    
  9.         public BelyService(Context context){  
  10.    
  11.                 super();  
  12.    
  13.         }  
  14.    
  15.         public int calculateSqu(int val){  
  16.    
  17.                 return val*val;  
  18.    
  19.         }  
  20. }  

3.   將 java服務新增到 ServiceManager中

在檔案 frameworks/base/services/java/com/android/server/SystemServer.java新增:

[java] view plain copy
  1. BelyService bs = new BelyService(context);  
  2. ServiceManager.addService("BelyService", bs);  

自此,重新編譯 Android並執行,我們所建立的服務即可訪問,下面是演示如何呼叫:
同樣在 package/apps下任意建立一個應用,呼叫服務的方法如下:

[java] view plain copy
  1. import android.os.ServiceManager;  
  2.    
  3. import android.os.IBelyService;  
  4.    
  5. IBelyService bs = IBelyService.Stub.asInterface(ServiceManager.getService("BelyService"));  
  6.    
  7. int ret = bs.calculateSqu(9);  

上面我們使用的是 Android內部的方法來獲取服務,當然也可以使用公開的 API: context.getSystemService來獲取。

相關文章