사용자 상호작용 처리

Glance를 사용하면 Action 클래스를 통한 사용자 상호작용 처리가 간소화됩니다. Glance Action 클래스는 사용자가 할 수 있는 작업을 정의하며, 개발자는 일어납니다. Action을 적용할 수 있습니다. GlanceModifier.clickable 메서드로 구성요소를 호출할 수 있습니다.

앱 위젯은 원격 프로세스에 있으므로 생성 시 작업이 정의됩니다. 실행은 원격 프로세스에서 일어납니다. 네이티브 RemoteViews에서 이 작업은 PendingIntents를 통해 실행됩니다.

이 페이지에는 다음 작업이 설명되어 있습니다.

를 통해 개인정보처리방침을 정의할 수 있습니다.

활동 시작

사용자 상호작용에서 활동을 시작하려면 actionStartActivity 함수에 Button 함수를 추가하여 GlanceModifier.clickable(..) 한정자를 사용하세요.

actionStartActivity에서 다음 중 하나를 제공합니다.

Glance는 작업을 제공된 타겟과 함께 PendingIntent로 변환합니다. 매개변수입니다. 다음 예에서 NavigationActivity는 사용자가 버튼을 클릭합니다.

@Composable
fun MyContent() {
    // ..
    Button(
        text = "Go Home",
        onClick = actionStartActivity<MyActivity>()
    )
}

서비스 시작

활동을 실행하는 것과 유사하게 사용자 상호작용 시 서비스를 시작할 때 (actionStartService 메서드)

actionStartService에서 다음 중 하나를 제공합니다.

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Sync",
        onClick = actionStartService<SyncService>(
            isForegroundService = true // define how the service is launched
        )
    )
}

방송 이벤트 전송

다음 중 하나를 사용하여 사용자 상호작용 시 브로드캐스트 이벤트를 전송합니다. actionSendBroadcast 메서드:

actionSendBroadcast에서 다음 중 하나를 제공합니다.

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

맞춤 작업 실행

Glance는 특정 타겟을 실행하는 대신 람다 작업이나 actionRunCallback: UI 또는 상태 업데이트와 같은 작업 실행 사용자 상호작용입니다.

람다 작업 실행

람다 함수를 UI 상호작용의 콜백으로 사용할 수 있습니다.

예를 들어 람다 함수를 GlanceModifier.clickable에 전달합니다. 특수키:

Text(
    text = "Submit",
    modifier = GlanceModifier.clickable {
        submitData()
    }
)

또는 이를 지원하는 컴포저블의 onClick 매개변수에 전달합니다.

Button(
    text = "Submit",
    onClick = {
        submitData()
    }
)

ActionCallback 실행

또는 actionRunCallback 메서드를 사용하여 사용자 상호작용입니다. 이를 위해 ActionCallback:

@Composable
private fun MyContent() {
    // ..
    Image(
        provider = ImageProvider(R.drawable.ic_hourglass_animated),
        modifier = GlanceModifier.clickable(
            onClick = actionRunCallback<RefreshAction>()
        ),
        contentDescription = "Refresh"
    )
}

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // TODO implement
    }
}

사용자가 클릭하면 제공된 suspend onAction 메서드가 ActionCallback가 호출되어 정의된 로직 (즉, 데이터 새로고침).

작업 수행 후 위젯을 업데이트하려면 새 인스턴스를 만들고 update(..)를 호출합니다. 자세한 내용은 GlanceAppWidget 상태 관리를 참고하세요. 섹션으로 이동합니다.

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // do some work but offset long-term tasks (e.g a Worker)
        MyAppWidget().update(context, glanceId)
    }
}

작업에 매개변수 제공

작업에 추가 정보를 제공하려면 ActionParameters를 사용하세요. API를 사용하여 유형이 지정된 키-값 쌍을 만듭니다. 예를 들어 클릭된 연결 대상:

private val destinationKey = ActionParameters.Key<String>(
    NavigationActivity.KEY_DESTINATION
)

class MyAppWidget : GlanceAppWidget() {

    // ..

    @Composable
    private fun MyContent() {
        // ..
        Button(
            text = "Home",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "home")
            )
        )
        Button(
            text = "Work",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "work")
            )
        )
    }

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        provideContent { MyContent() }
    }
}

그 아래에서 매개변수는 요청하여 타겟 활동에서 이를 가져오도록 허용합니다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

매개변수는 ActionCallback에도 제공됩니다. 정의된 Parameters.Key를 사용하여 값을 검색합니다.

class RefreshAction : ActionCallback {

    private val destinationKey = ActionParameters.Key<String>(
        NavigationActivity.KEY_DESTINATION
    )

    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        val destination: String = parameters[destinationKey] ?: return
        // ...
    }
}