閱讀491 返回首頁    go 技術社區[雲棲]


添加一個係統服務sytem service

方法一:

1.在應用中
com.xxx.spi.SPLListener.java/com.xxx.spi.SPIManager.java兩個類
SPIManager spiManager = (SPIManager) getSystemService("spiService");
spiListener = new MySPIListener();
spiManager.requestSPIUpdates(spiListener);

2.
需在android.app.ContextImpl.java中添加
private static SPIManager sSPIManager;
else if (SPI_SERVICE.equals(name)) {
            return getSPIManager();
        }

private SPIManager getSPIManager() {
        synchronized (sSync) {
            if (sSPIManager == null) {
                IBinder b = ServiceManager.getService(SPI_SERVICE);
                ISPIManager service = ISPIManager.Stub.asInterface(b);
                sSPIManager = new SPIManager(service);
            }
        }
        return sSPIManager;
    }

在android.content.Context.java中添加常量
public static final String SPI_SERVICE = "spiService";

3.com.xxx.spi.SPIManager.java
中有ISPIListerner.aidl的實現類ListenerTransport
private class ListenerTransport extends ISPIListener.Stub
ListenerTransport中有應用中注冊進來的回調監聽器SPIListener
ListenerTransport傳給frameworks/base/services/java/com/android/server/SPIManagerrService.java服

務器類,也就是aidl的回調注冊,一定是實現ISPIListener.stub的ListenerTransport類
SPIManagerService.java是通過jni調C++文件,其中需要把自己作為c++的回調對象,
在cpp文件中取得SPIManagerService類對象
static { class_init_native(); }初始化回調的方法,這樣在cpp文件中就隨時可以調class_init_native本地

方法中初始化過的函數。


4.frameworks/base/Android.mk文件中編譯ISPIListener.aidl,ISPIManager.aidl兩個文件成相應的java文件
frameworks/base/services/jni/Android.mk文件中編譯同目錄下的

com_android_server_SPIManagerService.cpp文件,注意cpp文件的命名與其對應的SPIManagerService.java

文件的包路徑之間的關係。
同目錄下的onload.cpp文件中添加
int register_android_server_SPIManagerService(JNIEnv* env);
register_android_server_SPIManagerService(env);

5.
frameworks/base/services/java/com/android/server/SystemServer.java中添加服務,並調服務的

systemReady方法
try {
                Slog.i(TAG, "---SPI Manager---");
                spiService = new SPIManagerService(context);
                ServiceManager.addService("spiService", spiService);
            } catch (Throwable e) {
                Slog.e(TAG, "---Failure starting spiService Manager---", e);
            }

if (spiServiceF != null) spiServiceF.systemReady();

6.
frameworks/base/core/jni/AndroidRuntime.cpp中添加
extern int register_android_server_SPIManagerService(JNIEnv* env);
不確定是不是必須的

方法二:

在systemserver.java中添加自己有make文件創建的包

System.loadLibrary("android_servers");
        System.loadLibrary("serialserver");

最後更新:2017-04-02 22:16:35

  上一篇:go android listivew 下拉回彈刷新
  下一篇:go 為 Android 添加 Java 層服務