0

onCreateEngine() 메서드를 다시 트리거하고 대체 배경 화면을 설정할 수 있도록 WatchFaceSerivce를 다시 시작하려고합니다.Android 서비스 다시 시작

그러나 내가 다시 시작하려고하는 Android 서비스는 진짜 싸움을 시작합니다. 코드가 작동하지 않는 것처럼 보이지만 실제로는 효과가 없습니다.

stopService(new Intent(getApplicationContext(), MyWatchfaceService.class)); 
startService(new Intent(getApplicationContext(), MyWatchfaceService.class)); 

나는 onCreateEngine를 트리거하거나 서비스를 시작하는 처음 이후에 다른 시계 얼굴에 엔진을 설정하는 안드로이드 내 서비스를 다시 시작 강제 할 수있는 방법이 있나요?

답변

1

배경 화면은 대부분 시스템 앱에서만 사용할 수있는 방법이있는 WallpaperManager에 의해 관리됩니다. 서비스를 시작하고 중지하는 것은 WallpaperManager입니다.

여러분의 제안은 아키텍처를 조금 변경하는 것입니다. 서브 클래스가 WatchFaceService이고 하위 클래스가 Engine 일 뿐이므로 둘 중 하나만 다시 시작해야합니다. 대신, Engine 안에 시계면 서랍이 여러 개 있어야합니다. 그래서 구조는 다음과 같다 : 당신이 그려지는보고 얼굴을 변경하려는 경우

WatchFaceService 

    Engine 

    AnalogWatchFaceDrawer 
    DigitalWatchFaceDrawer 
    FancyWatchFaceDrawer 
    FitnessWatchFaceDrawer 
    WeatherWatchFaceDrawer 

아니, 당신은 단지 현재의 서랍을 변경하고 즉시 다시 그리기를 강제해야한다.

편집 : 도면에 대한 는, 당신이 모든 현재 서랍에 캔버스와 경계를 통과하고 일을 할 수 있도록, 그래서 코드는 다음과 같이 표시됩니다

@Override 
    public void onDraw(Canvas canvas, Rect bounds) { 
     if (mCurrentWatchFaceDrawer != null) { 
      mCurrentWatchFaceDrawer.draw(canvas, bounds); 
     } 
    } 

그래서 당신에게 모든 드로잉 로직을 각 서랍에 맡기고 독립적으로 작업하게하십시오.

일부 리소스를로드하는 경우 서랍에는 수명주기가 있어야합니다. 따라서 onCreateonDestroy과 같은 자체 콜백이 필요합니다. 새 서랍을 설정하면 onCreate이라고 부르면 이미지가 나타나고 사라지면 onDestroy으로 전화하여 이후에 정리할 수 있습니다. 이제 서랍장에 다음과 같은 인터페이스가 있어야합니다.

public interface WatchFaceDrawer { 
    void onCreate(); 
    void onDestroy(); 
    void draw(Canvas canvas, Rect bounds); 
} 

다른 이벤트를 처리하려면 더 많은 것을 추가해야 할 것입니다.

+0

onDraw() 메서드는 Engine 클래스에 고유하지만 서랍은 어떻게 들어오고 엔진의 onDraw()에서 제공되는 것을 재정의합니까? 또한 onCreate() 메서드는 몇 개의 정적 이미지를로드합니다. Drawer는 호출 될 때마다 정적 이미지를로드해야합니까? 예를 들어 설명해 주시면 감사하겠습니다! – rmoh21

+0

제발 편집을 확인하십시오. – gruszczy

+0

감사합니다. – rmoh21