關於Android 添加系統級(java)服務和調用的編寫實現說明:本文當主要描述Android添加java 系統級服務的編寫實現。一.添加java 系統級服務: 目前網站上介紹的比較多,但是沒有很詳細的步驟和流程。現總結如下:以 AlarmManagerService為例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 負責建立服務進程並運行之。 在目錄/frameworks/base/core/java中IAlarmManager.aidl檔案.在目錄frameworks/base/services/java/com/android/server中AlarmManagerService的aidl的實作類別,在目錄frameworks/base/services/java/com/android/server增加 service的實現檔案.二.實驗測試添加java 系統級服務步驟: 1.增加aidl檔案在目錄/frameworks/base/core/java/android/app下增加中IDvbService.aidl.package android.app;interface IDvbService {int countTest(in int testvalue);}2.在目錄frameworks/base/services/java/com/android/server中增加DvbManagerService實現IDvbService.aidl類package com.android.server;import android.content.Context;import android.util.Slog;import android.app.IDvbService;class DvbManagerService extends IDvbService.Stub { private static final String TAG = "DvbManagerService"; private static final boolean localLOGV = false; private final Context mContext; public DvbManagerService(Context context) { super(); mContext = context; Slog.w(TAG, "DvbManagerService"); } public int countTest(int value){ return value*2; } } 3.在檔案 frameworks /base /services /java /com /android /server /SystemServer.java 類中run()方法中增加 Slog.i(TAG, "Alarm DvbManagerService"); DvbManagerService dvb = new DvbManagerService(context);//dvb Slog.i(TAG, "Alarm DvbManagerService dvb ="+dvb); ServiceManager.addService(Context.DVB_SERVICE, dvb); 4.在檔案/frameworks/base/core/java/android/content/Context.java中增加public static final String DVB_SERVICE = "dvb";//dvb5.在檔案/frameworks/base/core/java/android/app中增加DvbManager.javapackage android.app;import android.content.Context;import android.content.Intent;import android.os.RemoteException;import android.os.ServiceManager;public class DvbManager{//dvb private final IDvbService mService; /** * package private on purpose */ DvbManager(IDvbService service) { mService = service; } public int count(int value) { try { return mService.countTest(value); } catch (RemoteException ex) { } return -1; } }6.在檔案/frameworks/base/core/java/android/app/ContextImpl.java中新增加屬性 private static DvbManager sDvbManager;//dvb在getSystemService(String name)方中增加else if (DVB_SERVICE.equals(name)) {//dvb return getDvbManager(); } 另外增加方法 private DvbManager getDvbManager() {//dvb Log.e(TAG, "getDvbManager sSync = "+sSync); Log.e(TAG, "getDvbManager sDvbManager = "+sDvbManager); synchronized (sSync) { if (sDvbManager == null) { IBinder b = ServiceManager.getService(DVB_SERVICE); Log.e(TAG, "getDvbManager IBinder = "+b); IDvbService service = IDvbService.Stub.asInterface(b); Log.e(TAG, "getDvbManager IDvbService = "+service); sDvbManager = new DvbManager(service); } } return sDvbManager; }7.在/frameworks/base/Android.mk中LOCAL_SRC_FILES += \下增加core/java/android/app/IDvbService.aidl \8.在應用調用如下:匯入import android.app.DvbManager; 用法 DvbManager dvb=(DvbManager)getSystemService(DVB_SERVICE); int count = dvb.count(9); Toast.makeText( TVMainActivity.this,"dvb.count(9) back = "+count, Toast.LENGTH_SHORT).show();9.編譯如下:(1)首先編譯 frameworks. build/envsetup.sh choosecombo make -j4 framework編譯後會產生framework.jar(2)然後編譯frameworks/base/services/java的servicemake -j4 frameworks/base/services/java編譯後會產生services.jar(3)編譯應用因為服務是自訂的,所有必須在自訂的sdk中編譯才能使用。