2016年3月6日 星期日

為 Android 添加 Java 層服務

為 Android 添加 Java 層服務, 也就是添加自定義的aidl服務到serviceManager, 通過ServiceManager.getService取得服務


同前一篇文章類似,此文旨在簡單介紹一下如何在 java層添加自己的服務,相關的理論網上已經有很多文章,在此不在詳述。
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文件用來申明服務:
BelyService.aidl:
package android.os;
interface IBelyService {
        /**
        *
        */
        int calculateSqu(int value);
}

2.       在目錄
frameworks/base/services/java/com/android/server增加 service的實現文件:
BelyService.java:
package com.android.server;
import android.content.Context;
import android.os.IBelyService;
public class BelyService extends IBelyService.Stub {
        public BelyService(Context context){
                super();
        }
        public int calculateSqu(int val){
                return val*val;
        }
}

3.       將 java服務添加到 ServiceManager中:
BelyService bs = new BelyService(context);
ServiceManager.addService("BelyService", bs);


自此,重新編譯 Android並運行,我們所創建的服務即可訪問,下面是演示如何調用:
同樣在 package/apps下任意創建一個應用,調用服務的方法如下:
import android.os.ServiceManager;
import android.os.IBelyService;
IBelyService bs = IBelyService.Stub.asInterface(ServiceManager.getService("BelyService"));
int ret = bs.calculateSqu(9);


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


沒有留言:

張貼留言