LightsService 분석 --- 프로세스 분석(재인쇄를 위해 괄호 안의 내용을 삭제하십시오)

2.2 제어 프로세스 분석

2.2.1 LightsService 서비스 시작 프로세스

LightsService는 SystemServer에서 시작되며 필요한 모든 시스템 서비스는 SystemServer의 run() 메서드를 실행할 때 시작됩니다.

여기에는 LED 조명 및 화면 백라이트를 제어하고 SystemServer에서 서비스를 시작하는 데 사용되는 LightsService가 포함됩니다.

private void startBootstrapServices() {
    ...
    // Manages LEDs and display backlight so we need it to bring up the display.
    mSystemServiceManager.startService(LightsService.class);
    ...
}

LightsService 생성자는 시작 시 먼저 실행됩니다. 시공방법은 다음과 같습니다.

public LightsService(Context context) {
    super(context);
    mNativePointer = init_native();
    for (int i = 0; i < LightsManager.LIGHT_ID_COUNT; i++) {
        mLights[i] = new LightImpl(i);
    }
}

컨스트럭션 메서드에서 네이티브 메서드 init_native()를 통해 프라이빗 변수 mNativePointer에 값을 할당합니다. 이 메서드는 C++로 구현됩니다.

주요 작업은 각 Light 장치에 대한 공간을 할당하고 첫 번째 주소 포인터를 mNativePointer로 반환하는 것입니다. Light 장치에 대한 후속 기본 메서드

작업은 이 포인터에 따라 처리됩니다. 다음으로 for 루프를 사용하여 Light 인스턴스를 생성하고 배열에 저장합니다. 이 프로세스는 실제로 다음과 동일합니다.

init_native()에 해당하는 상위 계층은 각 Light 객체에 대한 저장 공간을 할당합니다. 이렇게 하면 구축 방법에서 초기화 작업이 완료된다.

다음으로 서비스의 생명주기 함수 onStart()를 호출합니다. onStart() 메서드에서는 private 메서드 publishLocalService 하나만 호출됩니다.

SystemService에서 프로토타입을 볼 수 있습니다.

/**
 * Publish the service so it is only accessible to the system process.
 */
protected final <T> void publishLocalService(Class<T> type, T service) {
    LocalServices.addService(type, service);
}

이것은 실제로 LightsManager//의 인스턴스인 LightsService 서비스를 등록할 때 전달되는 서비스 개체입니다.

private final LightsManager mService = new LightsManager() {
    @Override
    public Light getLight(int id) {
        if (id < LIGHT_ID_COUNT) {
            return mLights[id];
        } else {
            return null;
        }
    }
};

이 방법을 통해 LightsService는 로컬 서비스 라이브러리에 게시되며 LightsService는 로컬 서비스이므로 외부 애플리케이션에서 호출할 수 없음을 알 수 있습니다.

즉, LightsService는 플랫폼에서 제공하는 API에 속하지 않으며(그림 1-1 참조) JAVA 프레임워크의 동일한 패키지에 있는 다른 부분에서만 호출할 수 있습니다.

이 게시 메소드에는 두 개의 매개변수가 있는데 첫 번째 매개변수는 서비스 유형을 표시하고 서비스를 얻을 때 사용되는 유형입니다. 두 번째 매개변수는 서비스 개체의 인스턴스를 저장하는 데 사용됩니다.

로컬 서비스이므로 getLocalService(Class<T> tpye)를 통해 얻을 수 있습니다.LightService를 사용하는 Android 시스템의 알림 관리 서비스를 예로 들어 보겠습니다.

private Light mNotificationLight;
final LightsManager lights = getLocalService(LightsManager.class);
mNotificationLight=lights.getLight(LightsManager.LIGHT_ID_NOTIFICATIONS);

안드로이드 시스템에 알림 메시지가 있을 때 표시등을 획득하여 제어하는 ​​과정입니다. 여기서는 실제로 디자인 모드의 프록시(Proxy) 모드를 사용하는데,

LightsManager는 LightsService 서비스의 프록시 역할을 합니다. 이 시점에서 LightsService가 시작되고 서비스를 제공할 수 있습니다.

원격 서비스를 통해 LightsService 서비스에 액세스하려면 다른 방법으로 서비스를 등록해야 합니다.

/**
 * Publish the service so it is accessible to other services and apps.
 */
protected final void publishBinderService(String name, IBinder service,
        boolean allowIsolated) {
    ServiceManager.addService(name, service, allowIsolated);
}

즉, 서비스 객체는 Binder 매커니즘을 통해 ServiceManager에 전달되고, 이름을 통해 ServiceManager로부터 서비스를 획득할 수 있으며, 이와 같은 방식으로 다른 애플리케이션에 서비스 인터페이스를 제공한다.

2.2.2 전등 스위치 및 깜박임 가져오기 및 제어

LightsService가 시작되고 실행되면 LightsManager를 통해 조명을 가져와 작동할 수 있습니다. 빛의 인스턴스는 메서드를 얻을 때 ID로 얻습니다. 다음으로 상위 계층에서 조명의 켜짐 및 꺼짐과 깜박임을 제어하는 ​​방법을 주로 분석합니다.

빛의 제어는 주로 빛의 밝기 값 설정, 빛의 색상 설정, 빛의 깜박임 설정, 빛의 펄스 설정 및 빛 끄기를 포함하여 Lingt 클래스에서 완료됩니다. 방법은 다음과 같습니다.

public abstract void setBrightness(int brightness);
public abstract void setBrightness(int brightness, int brightnessMode);
public abstract void setColor(int color);
public abstract void setFlashing(int color, int mode, int onMS, int offMS);
public abstract void pulse();
public abstract void pulse(int color, int onMS);
public abstract void turnOff();

이러한 메소드의 구현에서 매개변수 처리 후에 메소드가 호출됩니다: setLightLocked(int color, int mode, int onMS, inoffMS, int brightmodeMode).

그 중 pulse() 메서드는 지연된 처리기 작업을 시작하여 설정된 시간 이후에 표시등 깜박임을 중지합니다. 위의 각 방법은 서로 다른 지정

각각의 목표를 달성하기 위한 매개변수. 첫 번째 매개변수는 색상 값이거나 전달된 밝기 값에서 색상 값으로 변환됩니다. 두 번째 매개 변수는 밝기 모드이며 여기에는 세 가지 옵션 값이 있습니다.

이 세 가지 모드의 의미는 light.h(4장에서 소개됨)의 정의에서 볼 수 있습니다. LIGHT_FLASH_NONE은 깜박임 없음을 의미하고 LIGHT_FLASH_TIMED는

점멸 설정 시간, 켜진 시간과 꺼진 시간을 지정할 수 있습니다. LIGHT_FLASH_HARDWARE는 빛의 깜박임이 하드웨어에 의해 제어되어야 함을 의미합니다. 세 번째 및

네 번째 매개변수는 켜짐 및 꺼짐 시간을 나타냅니다. 마지막 매개변수는 밝기 모드인데, 여기에는 BRIGHTNESS_MODE_USER와 BRIGHTNESS_MODE_SENSOR 두 가지 선택적 값이 있는데,

차례로 밝기는 사용자가 설정하고 밝기는 광 센서에 의해 설정됩니다.

setLightLocked 메서드는 로컬 메서드 setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightMode)를 호출합니다.

이 중 mNativePointer 파라미터는 위에서 설명한 것처럼 LightsService 서비스가 시작될 때 초기화 후 반환되는 시스템의 모든 조명 장치의 시작 주소 포인터입니다.

여기까지는 실제로 위의 매개변수를 하단 레이어로 전달하여 램프 장비를 처리합니다. 위의 인터페이스에 익숙하다면 상위 계층의 조명을 제어할 수 있습니다.

추천

출처blog.csdn.net/xiaowang_lj/article/details/132117364