본문 바로가기

개발관련/안드로이드

[ Android ] Java Service 구현

1. AIDL 을 이용한
 HelloJavaService service_interface, service_proxy, service_stub class 생성

2. HelloJavaService

3. HelloJavaManager 구현

====================================================================================

1. interface, proxy, stub 생성을 위한 aidl 파일
/frameworks/base/core/java/android/app/IHelloJava.aidl

package android.app;

interface IHelloJava {
    printHello();
}

2. 새로 만든 aidl 이 같이 compile 되도록 추가
/framework/base/Android.mk

LOCAL_SRC_FILES += \
    .... \
    core/java/android/app/IHelloJava.aidl \
    .... \

3. 서비스 구현
/framework/base/services/java/com/android/server/HelloJavaService.java

package com.android.server;

import android.os.RemoteException;
import android.content.Context;
import android.util.Log;
import android.app.HelloJavaManager;
import android.app.IHelloJava;

public class HelloJavaService extends IHelloJava.Stub {
    Context mContext;

    public HelloJavaService(Context context) {
        mContext = context;
    }

    public void printHello() throws RemoteException {
        Log.i("HelloJavaService", "Hello, Java Service!");
    }
}

4. SystemServer 실행 루틴에 서비스 등록코드 추가
/framework/base/services/java/com/android/server/SystemServer.java

HelloJavaService helloJava = new HelloJavaService(context);
ServiceManager.addService(Context.HELLOJAVA_SERVICE, helloJava);

5. 서비스 이름 문자 상수열 등록
/frameworks/base/core/java/android/content/Context.java

public static final String HELLOJAVA_SERVICE = "hellojava";

6. 서비스를 어플리케이션에서 사용할 수 있도록 래퍼 클래스 구현
/frameworks/base/core/java/android/app/HelloJavaManager.java

package android.app;

import android.os.RemoteException;

public class HelloJavaManager
{
    private final IHelloJava mService;

    HelloJavaManager(IHelloJava service) {
        mService = service;
    }

    public void printHello() {
        mService.printHello();
    }
}

7. 컨텍스트에 시스템서비스 획득 코드 추가
/frameworks/base/core/java/android/app/ApplicationContext.java

class ApplicationContext extends Context {
    ...
    private static HelloJavaManager sHelloJavaManager;
    ...

    public Object getSystemService(String name) {
        ...
        } else if (HELLOJAVA_SERVICE.equals(name)) {
            return getHelloJavaManager();
        }
        ...
    }

    private HelloJavaManager getHelloJavaManager() {
        synchronized (sSync) {
            if (sHelloJavaManager == null) {
                IBinder b = ServiceManager.getService(HELLOJAVA_SERVICE);
                IHelloJava service = IHelloJava.Stub.asInterface(b);
                sHelloJavaManager = new HelloJavaManager(service);
           }
        }
        return sHelloJavaManager;
    }
   
8. HelloJavaService 사용

HelloJavaManager hello =
    (HelloJavaManager)getSystemService(Context.HELLOJAVA_SERVICE);