이번 편의 목표: 앱 안의 작업 하나를 AppFunction으로 표시해, 기기 위 에이전트가 그 작업을 찾을 수 있게 합니다.
안드로이드 17은 AppFunctions로 앱의 기능을 도구처럼 등록합니다. 기기 안의 에이전트는 이 도구를 발견하고, 사용자의 요청으로 앱의 로컬 상태를 다루는 작업을 실행합니다. 발표 시점의 Jetpack 라이브러리는 알파입니다. 제미나이 연결은 비공개 프리뷰라서, 임의의 앱이 바로 제미나이 도구 목록에 들어가지는 않습니다. 앱은 함수를 먼저 등록하고 ADB와 테스트 에이전트 앱으로 호출을 확인합니다. 초기 참여 신청 주소는 다음과 같습니다.
등록은 클래스의 함수에 애너테이션을 붙이고, KDoc에 매개변수 뜻을 적는 형태입니다. isDescribedByKDoc이 참이면 이 설명이 도구 설명으로 쓰입니다. 책 메모를 하나 남기는 함수는 이렇게 경계를 나눕니다.
/**
* 도서관 앱의 앱 함수입니다.
*/
class LibraryFunctions(
private val books: BookRepository
) {
/**
* 읽던 책에 메모를 추가합니다.
*
* @param context 함수 실행 맥락.
* @param title 책 제목.
* @param memo 남길 메모.
*/
@AppFunction(isDescribedByKDoc = true)
suspend fun addMemo(
context: AppFunctionContext,
title: String,
memo: String
): Memo {
return books.addMemo(title, memo)
}
}도구 설명은 KDoc에만 있습니다. 함수 본문은 저장소 호출 하나로 두고, 화면 이동이나 권한 대화상자를 넣지 않습니다. 에이전트는 화면을 보지 않고 이 함수를 호출합니다. title과 memo가 비어 있을 때의 거절은 BookRepository 안에서 합니다.
다른 기기로 작업을 잇는 Continue On은 별도 API입니다. 활동을 넘길 수 있을 때 setHandoffEnabled(true, null)로 켜고, onHandoffActivityDataRequested()에서 상대 기기가 다시 열 데이터를 반환합니다. 앱이 상대 기기에 없으면 웹으로 떨어질 수 있게 데이터를 구성합니다.
라이브러리 좌표와 테스트용 ADB 명령은 알파 문서가 버전마다 바뀌므로, 의존성을 추가하기 전에 그 버전의 출시 노트를 확인합니다. 함수 시그니처를 먼저 고정해 두면 라이브러리 버전이 바뀌어도 저장소 코드는 그대로 둡니다.
직접 해 보기
addMemo가 빈 제목을 저장소에 넘기지 않도록 BookRepository에서 거절하세요. 에이전트 설명에는 KDoc의 매개변수 문장만 보이게 함수 본문에 안내 문자열을 넣지 않습니다.
해설
빈 제목은 저장소가 예외를 던지거나 실패 값을 반환하면 됩니다. 앱 함수는 그 결과를 그대로 돌려주고, 토스트나 화면 전환을 하지 않습니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.