시계 모드 서비스 빌드

시계 모드는 Wear OS 앱에서 패키징된 서비스입니다. 사용자가 사용 가능한 시계 모드를 선택하면 시계 모드가 표시되고 서비스 콜백 메서드가 호출됩니다.

사용자가 시계 모드가 있는 Wear OS 앱을 설치하면 시계에서 시계 모드 선택기를 통해 시계 모드를 사용할 수 있습니다. 또는 사용자가 페어링된 스마트폰의 호환 앱에서 시계 모드를 선택할 수 있습니다.

이 페이지에서는 시계 모드를 포함하도록 Wear OS 프로젝트를 구성하는 방법 및 시계 모드 서비스를 구현하는 방법에 관해 설명합니다.

시계 모드 프로젝트 만들기

Android 스튜디오에서 시계 모드용 프로젝트를 만들려면 다음과 같이 하세요.

  1. File > New > New project를 클릭합니다.
  2. Create Android Project 창에서 기본값을 적용하고 Next를 클릭합니다.
  3. Target Android Devices 창에서 Wear 옵션만 선택하고, SDK 버전 목록에서 사용 가능한 최신 버전을 선택합니다. Next를 클릭합니다.
  4. Add an Activity to Wear 창에서 Watch Face를 선택하고 Next를 클릭합니다.
  5. Configure Activity 창에서 기본값을 적용하고 Finish를 클릭합니다.

Android 스튜디오는 시계 모드 서비스용 app 모듈로 프로젝트를 만듭니다. Android 스튜디오의 프로젝트에 관한 자세한 내용은 프로젝트 만들기를 참조하세요.

종속성

웨어러블 지원 라이브러리는 시계 모드 구현을 만들기 위해 확장하는 필수 클래스를 제공합니다. Google Play 서비스 클라이언트 라이브러리(play-servicesplay-services-wearable)는 Wearable Data Layer API를 사용하여 호환 기기와 웨어러블 간의 데이터 항목을 동기화하는 데 필요합니다.

Android 스튜디오는 위 지침에서 프로젝트를 만들 때 build.gradle 파일에서 필수 항목을 자동으로 추가합니다.

Wearable Support Library API 참조

참조 문서는 시계 모드를 구현하는 데 사용하는 클래스에 관한 자세한 정보를 제공합니다. 웨어러블 지원 라이브러리용 API 참조 문서를 찾아보세요.

참고: Wear OS 개발에는 프로젝트 설정, 라이브러리 포함, 패키징 편의성을 제공하는 Android 스튜디오를 사용하는 것이 좋습니다.

권한 선언

시계 모드에는 WAKE_LOCK 권한이 필요합니다. manifest 요소 아래에서 Wear OS 앱(웨어러블 앱)과 모바일(스마트폰) 앱 모두의 매니페스트 파일에 다음 권한을 추가합니다.

    <manifest ...>
        <uses-permission
            android:name="android.permission.WAKE_LOCK" />

        <!-- Required for complications to receive complication data and open the provider chooser. -->
        <uses-permission
            android:name="com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA"/>
        ...
    </manifest>
    

주의: 핸드헬드 앱에는 웨어러블 앱에 선언된 모든 권한을 포함해야 합니다.

서비스 및 콜백 메서드 구현

Wear OS의 시계 모드는 서비스로 구현됩니다. 시계 모드가 활성 상태이면 시스템에서 시간이 변경되거나 중요한 이벤트가 발생할 때(예: 대기 모드로 전환 또는 새로운 알림 수신) 서비스의 메서드를 호출합니다. 그런 다음 서비스 구현에서는 업데이트된 시간 및 기타 관련 데이터를 사용하여 화면에 시계 모드를 그립니다.

시계 모드를 구현하려면 CanvasWatchFaceServiceCanvasWatchFaceService.Engine 클래스를 확장한 다음 CanvasWatchFaceService.Engine 클래스의 콜백 메서드를 재정의합니다. 이러한 클래스는 웨어러블 지원 라이브러리에 포함되어 있습니다.

다음 스니펫은 구현해야 하는 주요 메서드를 간략하게 설명합니다.

Kotlin

    class AnalogWatchFaceService : CanvasWatchFaceService() {

        override fun onCreateEngine(): Engine {
            /* provide your watch face implementation */
            return Engine()
        }

        /* implement service callback methods */
        inner class Engine : CanvasWatchFaceService.Engine() {

            override fun onCreate(holder: SurfaceHolder) {
                super.onCreate(holder)
                /* initialize your watch face */
            }

            override fun onPropertiesChanged(properties: Bundle?) {
                super.onPropertiesChanged(properties)
                /* get device features (burn-in, low-bit ambient) */
            }

            override fun onTimeTick() {
                super.onTimeTick()
                /* the time changed */
            }

            override fun onAmbientModeChanged(inAmbientMode: Boolean) {
                super.onAmbientModeChanged(inAmbientMode)
                /* the wearable switched between modes */
            }

            override fun onDraw(canvas: Canvas, bounds: Rect) {
                /* draw your watch face */
            }

            override fun onVisibilityChanged(visible: Boolean) {
                super.onVisibilityChanged(visible)
                /* the watch face became visible or invisible */
            }
        }
    }
    

자바

    public class AnalogWatchFaceService extends CanvasWatchFaceService {

        @Override
        public Engine onCreateEngine() {
            /* provide your watch face implementation */
            return new Engine();
        }

        /* implement service callback methods */
        private class Engine extends CanvasWatchFaceService.Engine {

            @Override
            public void onCreate(SurfaceHolder holder) {
                super.onCreate(holder);
                /* initialize your watch face */
            }

            @Override
            public void onPropertiesChanged(Bundle properties) {
                super.onPropertiesChanged(properties);
                /* get device features (burn-in, low-bit ambient) */
            }

            @Override
            public void onTimeTick() {
                super.onTimeTick();
                /* the time changed */
            }

            @Override
            public void onAmbientModeChanged(boolean inAmbientMode) {
                super.onAmbientModeChanged(inAmbientMode);
                /* the wearable switched between modes */
            }

            @Override
            public void onDraw(Canvas canvas, Rect bounds) {
                /* draw your watch face */
            }

            @Override
            public void onVisibilityChanged(boolean visible) {
                super.onVisibilityChanged(visible);
                /* the watch face became visible or invisible */
            }
        }
    }
    

CanvasWatchFaceService 클래스는 View.invalidate() 메서드와 유사한 무효화 메커니즘을 제공합니다. 시스템이 시계 모드를 다시 그리도록 하려면 구현을 통해 invalidate() 메서드를 호출할 수 있습니다. 기본 UI 스레드에서만 invalidate()를 사용할 수 있습니다. 다른 스레드에서 캔버스를 무효화하려면 postInvalidate() 메서드를 호출합니다.

CanvasWatchFaceService.Engine 클래스에서 메서드를 구현하는 방법에 관한 자세한 내용은 시계 모드 그리기를 참조하세요.

시계 모드 서비스 등록

시계 모드 서비스를 구현한 후 웨어러블 앱의 매니페스트 파일에 구현을 등록합니다. 사용자가 이 앱을 설치하면 시스템은 서비스에 관한 정보를 사용하여 Wear OS 호환 앱 및 웨어러블 기기의 시계 모드 선택도구에서 시계 모드를 사용할 수 있도록 설정합니다.

다음 스니펫은 application 요소 아래에서 시계 모드 구현을 등록하는 방법을 보여줍니다.

    <service
        android:name=".AnalogWatchFaceService"
        android:label="@string/analog_name"
        android:permission="android.permission.BIND_WALLPAPER" >
        <meta-data
            android:name="android.service.wallpaper"
            android:resource="@xml/watch_face" />
        <meta-data
            android:name="com.google.android.wearable.watchface.preview"
            android:resource="@drawable/preview_analog" />
        <meta-data
            android:name="com.google.android.wearable.watchface.preview_circular"
            android:resource="@drawable/preview_analog_circular" />
        <intent-filter>
            <action android:name="android.service.wallpaper.WallpaperService" />
            <category
                android:name=
                "com.google.android.wearable.watchface.category.WATCH_FACE" />
        </intent-filter>
    </service>
    

웨어러블 기기의 Wear OS 호환 앱과 시계 모드 선택도구는 기기에 설치된 모든 시계 모드를 사용자에게 표시할 때 com.google.android.wearable.watchface.preview 메타데이터 항목에 의해 정의된 미리보기 이미지를 사용합니다. 드로어블을 가져오려면 Wear OS 기기 또는 에뮬레이터 인스턴스에서 시계 모드를 실행하고 스크린샷을 만듭니다. hdpi 화면이 있는 Wear OS 기기에서는 미리보기 이미지의 크기가 일반적으로 320x320픽셀입니다.

원형 기기에서 크게 달라 보이는 시계 모드는 원형 및 정사각형 미리보기 이미지를 모두 제공할 수 있습니다. 원형 미리보기 이미지를 지정하려면 com.google.android.wearable.watchface.preview_circular 메타데이터 항목을 사용합니다. 시계 모드에 두 개의 미리보기 이미지가 모두 포함되어 있으면 웨어러블의 호환 앱과 시계 모드 선택도구가 시계의 모양에 따라 적절한 이미지를 표시합니다. 원형 미리보기 이미지가 포함되지 않은 경우 정사각형 미리보기 이미지가 정사각형 및 원형 기기에 모두 사용됩니다. 원형 기기에서는 둥근 모양을 사용하여 정사각형 미리보기 이미지가 잘립니다.

android.service.wallpaper 메타데이터 항목은 wallpaper 요소가 포함된 watch_face.xml 리소스 파일을 지정합니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" />
    

웨어러블 앱에는 둘 이상의 시계 모드를 포함할 수 있습니다. 각각의 시계 모드 구현에서 웨어러블 앱의 매니페스트 파일에 서비스 항목을 추가해야 합니다.