Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

개발일기: Wear OS Complication 클릭 시 앱 실행하기

Billcorea 2025. 11. 15. 15:30
반응형

wear os

 

🚀 개발일기: Wear OS Complication 클릭 시 앱 실행하기

오늘 Wear OS Complication을 탭했을 때, 내가 만든 워치 앱이 실행되도록 하는 기능을 구현했습니다. 이 기능은 사용자가 워치 페이스에서 바로 앱으로 진입할 수 있게 해주는 중요한 인터랙션입니다.

✨ 핵심 아이디어: `PendingIntent` 사용하기

Complication을 클릭해서 앱을 실행하려면, Complication 데이터에 `PendingIntent`라는 특별한 객체를 연결해야 합니다. 이 `PendingIntent`는 사용자가 Complication을 탭했을 때 시스템이 내 앱의 특정 부분을 대신 실행해 줄 수 있도록 하는 '권한' 같은 것입니다.

🛠️ 코드 수정 방법 (`MainComplicationService.kt`)

Complication 데이터를 생성하는 MainComplicationService.kt 파일의 createComplicationData 함수를 수정해야 합니다.

1. 필요한 `import` 추가

파일 상단에 다음 두 줄을 추가해주세요:

import android.content.Intent
import android.app.PendingIntent
import com.billcorea.habit1007.MainActivity // 당신의 워치 앱 메인 Activity 경로

com.billcorea.habit1007.MainActivity는 당신의 실제 워치 앱의 MainActivity 경로로 변경해야 합니다.

2. `createComplicationData` 함수 수정

createComplicationData 함수 내에서 다음처럼 `Intent`와 `PendingIntent`를 만들고 `tapAction`에 연결합니다.

private fun createComplicationData(text: String, contentDescription: String): ComplicationData {
    // 1. Complication을 탭했을 때 실행할 Intent를 만듭니다.
    val intent = Intent(this, MainActivity::class.java).apply {
        // 앱이 새 태스크(Task)에서 시작되도록 플래그를 추가합니다.
        // Complication에서 앱을 시작할 때 일반적으로 권장됩니다.
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    }

    // 2. 이 Intent를 PendingIntent로 감싸서, 워치 페이스가 나중에 실행할 수 있도록 합니다.
    //    '0'은 요청 코드 (여러 PendingIntent를 만들 때 다르게 지정).
    //    FLAG_IMMUTABLE은 Android 12(API 31) 이상에서 반드시 필요합니다.
    val pendingIntent = PendingIntent.getActivity(
        this,
        0, // 요청 코드
        intent,
        PendingIntent.FLAG_IMMUTABLE // Android 12 이상 필수
    )

    // 3. ComplicationData에 위에서 만든 PendingIntent를 tapAction으로 설정합니다.
    return ShortTextComplicationData.Builder(
        text = PlainComplicationText.Builder(text).build(),
        contentDescription = PlainComplicationText.Builder(contentDescription).build()
    )
    .setTapAction(pendingIntent) // 여기에 tapAction을 추가합니다!
    .build()
}

⚠️ PendingIntent.FLAG_IMMUTABLE은 Android 12 (API 31) 이상을 타겟팅할 경우 필수입니다. 이 플래그를 넣지 않으면 앱이 충돌할 수 있습니다.

✅ 이제 완성입니다!

위 코드 수정 후 앱을 빌드하고 워치에 배포하면, Complication을 탭했을 때 당신의 MainActivity가 실행될 것입니다. 매우 간단하죠?

✨ 요약하자면?

Complication 클릭 시 앱을 실행하려면, MainComplicationService에서 Intent를 사용하여 실행할 Activity를 지정하고, 이를 PendingIntent로 변환한 뒤 ComplicationDatasetTapAction()에 연결하면 됩니다.

반응형