Java層服務顧名思義即爲從 Java層提供的服務,它與 C++層的服務不同之處在於其服務進程的運行由系統( ServiceManager)統一維護。在文件 frameworks /base /services /java /com /android /server /SystemServer.java 中我們可以看到以下代碼:
AlarmManagerService alarm = new AlarmManagerService (context );
ServiceManager .addService (Context .ALARM_SERVICE , alarm );
這個操作在系統啓動時完成,由 ServiceManager 負責創建服務進程並運行之。所以我們要做的事就是實現一個 java 服務,並將其添加到這裏並由系統運行起來,以下是具體實現步驟:
實現自己的 java層 service
1. 在目錄
frameworks/base/core/java/android/os中增加自己的 AIDL文件用來申明服務:
IJobenService.aidl:
package android.os;
/** {@hide} */
interface IJobenService
{
int calculateSqu(int value);
}
2. 在目錄
frameworks/base/services/java/com/android/server增加 service的實現文件:
JobenService.java:
package com.android.server;
import android.content.Context;
import android.os.IJobenService;
public class JobenService extends IJobenService.Stub{
public JobenService(Context context) {
super();
}
public int calculateSqu(int val) {
return val*val;
}
}
3. 將 java服務添加到 ServiceManager中:
try {
Slog.i(TAG, "Joben Server");
//JobenService js = new JobenService(context);
ServiceManager.addService("JobenService", new JobenService(context));
} catch (Throwable e) {
reportWtf("starting joben Service", e);
}
4. 在/framework/base/下的Android.mk裏添加自己的aidl
core/java/android/os/IJobenService.aidl \
自此,重新編譯 Android並運行,我們所創建的服務即可訪問,下面是演示如何調用:
同樣在 package/apps下任意創建一個應用,調用服務的方法如下:
import android.os.ServiceManager;
import android.os.IJobenService;
IJobenService js = IJobenService.Stub.asInterface(ServiceManager.getService("JobenService"));
int ret = bs.calculateSqu(9);
上面我們使用的是 Android內部的方法來獲取服務,當然也可以使用公開的 API: context.getSystemService來獲取。