바로가기 관리

바로가기를 만든 후 앱의 전체 기간 동안 바로가기를 관리해야 할 수 있습니다. 예를 들어 사용자가 바로가기로 특정 작업을 완료하는 빈도를 확인하여 앱을 최적화할 수 있습니다. 또는 앱이 오래되었거나 누락된 작업을 실행하지 못하도록 고정된 바로가기를 사용 중지할 수도 있습니다. 대화에서 참조되는 바로가기의 경우 사용량을 추적하여 바로가기 순위를 개선하는 신호를 제공할 수 있습니다.

이 페이지에서는 바로가기를 관리하는 이러한 방법과 기타 몇 가지 일반적인 방법을 설명합니다.

바로가기 동작

다음 섹션에는 가시성, 표시 순서, 순위를 비롯한 바로가기 동작에 관한 일반적인 정보가 포함되어 있습니다.

바로가기 공개 상태

정적 바로가기와 동적 바로가기는 사용자가 특정 동작이나 음성 명령을 실행할 때 지원되는 런처나 어시스턴트에 표시됩니다. 지원되는 런처에서 동작은 앱의 런처 아이콘을 길게 터치하는 것이지만 다른 런처 앱에서는 동작이 다를 수 있습니다. Google 어시스턴트를 사용하면 어시스턴트 내에 바로가기를 표시하거나 사용자 음성 명령으로 바로가기를 실행할 수 있습니다.

LauncherApps 클래스는 런처 앱이 바로가기에 액세스할 수 있는 API를 제공합니다.

고정된 바로가기는 런처 자체에 나타나므로 항상 표시됩니다. 고정된 바로가기는 다음 경우에만 런처에서 삭제됩니다.

  • 사용자가 고정된 바로가기를 삭제하는 경우
  • 고정된 바로가기와 연결된 앱이 제거되는 경우
  • 사용자가 설정 > 앱 및 알림으로 이동하여 앱을 선택한 다음 저장용량 > 저장용량 비우기를 탭하여 앱 데이터를 삭제합니다.

공유 타겟은 Android 공유 시트의 직접 공유 행에 표시되는 동적 바로가기의 하위 집합입니다.

Android Sharesheet
그림 1. Android Sharesheet 직접 공유 타겟이 첫 번째 행에 표시되고, 그 뒤에 순위가 매겨진 앱과 앱 목록이 표시됩니다.

바로가기 표시 순서

런처가 앱의 바로가기를 표시할 때 바로가기는 다음 순서로 표시되어야 합니다.

  1. 정적 바로가기: isDeclaredInManifest() 메서드가 true를 반환하는 바로가기입니다.
  2. 동적 바로가기: ShortcutInfo.isDynamic() 메서드가 true를 반환하는 바로가기입니다.

각 바로가기 유형(정적 및 동적) 내에서 바로가기는 ShortcutInfo.getRank에 따라 순위가 높아지는 순서로 정렬됩니다. Google 어시스턴트는 사용자에게 표시할 상황별 바로가기를 결정할 때 바로가기 순위도 고려합니다.

순위는 음이 아닌 순차적 정수입니다. 정적 바로가기는 shortcuts.xml 파일에 표시되는 순서대로 첫 번째부터 마지막까지 순위가 지정됩니다. 동적 바로가기의 경우 updateShortcuts(Context, List), addDynamicShortcuts(Context, List), pushDynamicShortcut(Context, ShortcutInfoCompat) 또는 setDynamicShortcuts(Context, List)를 호출할 때 기존 바로가기의 순위를 업데이트할 수 있습니다.

공유 타겟의 순서는 과거 사용자 기록, 최근성, 빈도, 순위 힌트, 앱 사용, 공유 바로가기와 연결된 대화에 설정된 우선순위 등 다양한 요소를 기반으로 합니다. Sharing Shortcuts API를 사용하여 만든 공유 타겟은 Android 11에서 지원 중단된 ChooserTargetService에서 생성된 공유 타겟보다 우선순위가 높습니다. Android 12 이상에서는 지원 중단된 ChooserTargetService에 의해 생성된 공유 타겟이 더 이상 공유 시트에 표시되지 않습니다.

대부분의 런처는 최대 4개의 바로가기를 표시합니다. 정의된 정적 바로가기와 동적 바로가기의 조합에 대해 런처는 최대 2개의 정적 바로가기와 2개의 동적 바로가기를 표시합니다. 예를 들어 정적 바로가기 4개를 정의하고 프로그래매틱 방식으로 동적 바로가기 3개를 만들면 런처는 처음 두 개의 정적 바로가기와 가장 순위가 높은 두 개의 동적 바로가기를 표시합니다.

여러 인텐트 및 활동 관리

사용자가 바로가기를 활성화할 때 앱에서 여러 작업을 실행하도록 하려면 연속적인 활동을 트리거하도록 구성하면 됩니다. 바로가기 유형에 따라 여러 인텐트를 할당하거나, 한 활동에서 다른 활동을 시작하거나, 인텐트 플래그를 설정하여 이 작업을 실행할 수 있습니다.

다른 활동에서 활동 시작

정적 바로가기에는 맞춤 인텐트 플래그가 있을 수 없습니다. 정적 바로가기의 첫 번째 인텐트에는 항상 Intent.FLAG_ACTIVITY_NEW_TASK 및 Intent.FLAG_ACTIVITY_CLEAR_TASK가 설정되어 있습니다. 즉, 앱이 실행 중일 때 정적 바로가기가 실행되면 앱의 모든 기존 활동이 소멸됩니다. 이 동작을 원하지 않는 경우 실행 블록 내에서 또는 Compose 콘텐츠가 설정되기 전에 onCreate를 호출하여 finish를 호출하여 트램펄린 활동(다른 활동을 시작하는 보이지 않는 활동)을 사용할 수 있습니다.

  1. AndroidManifest.xml file에서 트램펄린 활동에 속성 할당 android:taskAffinity=""을 포함합니다.

  2. 바로가기 리소스 파일에서 정적 바로가기 내의 인텐트에 있는 트램펄린 활동을 참조합니다.

트램펄린 활동에 관한 자세한 내용은 다른 활동에서 활동 시작을 참고하세요.

인텐트 플래그 설정

Intent 플래그 집합을 사용하여 동적 바로가기를 게시할 수 있습니다. 바로가기의 인텐트에 Intent.FLAG_ACTIVITY_SINGLE_TOP과 Intent.FLAG_ACTIVITY_CLEAR_TOP의 조합을 지정하는 것이 좋습니다. 이렇게 하면 ComponentActivity가 이미 활성 상태인 경우 소멸되지 않고 포그라운드로 전환되어 재사용되므로 단일 활동 아키텍처가 onNewIntent()를 통해 바로가기 이벤트를 원활하게 처리할 수 있습니다.

작업 및 인텐트 플래그에 관한 자세한 내용은 작업 및 백 스택을 참고하세요.

바로가기 업데이트

각 앱의 런처 아이콘에는 getMaxShortcutCountPerActivity에서 반환하는 값과 동일한 수의 정적 및 동적 바로가기가 포함될 수 있습니다. 앱에서 만들 수 있는 고정된 바로가기 수에는 제한이 없습니다.

동적 바로가기가 고정되면 게시자가 동적 바로가기로 삭제하더라도 고정된 바로가기는 계속 표시되고 실행할 수 있습니다. 이렇게 하면 앱에 getMaxShortcutCountPerActivity개 이상의 바로가기가 있을 수 있습니다.

getMaxShortcutCountPerActivity에서 반환된 값이 4라고 가정하는 다음 예시를 살펴보세요.

  1. 채팅 앱은 가장 최근의 대화 4개(c1, c2, c3, c4)를 나타내는 동적 바로가기 4개를 게시합니다.
  2. 사용자는 바로가기를 4개 모두 고정합니다.
  3. 나중에 사용자가 세 개의 대화(c5, c6, c7)를 추가로 시작합니다. 게시자 앱이 동적 바로가기를 다시 게시합니다. 새 동적 바로가기 목록은 c4, c5, c6, c7입니다.

앱은 동적 바로가기를 4개 이상 표시할 수 없으므로 c1, c2, c3을 삭제해야 합니다. 하지만 c1, c2, c3은 사용자가 액세스하고 실행할 수 있는 고정된 바로가기로 남아 있습니다.

그러면 사용자는 게시자 앱의 활동에 연결되는 총 7개의 바로가기에 액세스할 수 있습니다. 총 개수에는 최대 바로가기 수와 고정된 바로가기 3개가 포함되기 때문입니다.

  1. 앱은 updateShortcuts(Context, List)를 사용하여 기존 바로가기 7개 중 하나를 업데이트할 수 있습니다. 예를 들어 채팅 피어의 아이콘이 변경되면 이 바로가기 집합을 업데이트할 수 있습니다.
  2. addDynamicShortcuts(Context, List) 및 setDynamicShortcuts(Context, List) 메서드를 사용하여 동일한 ID로 기존 바로가기를 업데이트할 수 있습니다. 하지만 이 두 메서드는 지정된 바로가기 목록을 동적 바로가기로 변환하려고 시도하므로 동적이 아닌 고정된 바로가기를 업데이트하는 데는 사용할 수 없습니다.

Google 어시스턴트와 같은 지원 앱에 표시하기 위해 푸시할 수 있는 바로가기 수에는 제한이 없습니다. ShortcutManagerCompat Jetpack 라이브러리의 pushDynamicShortcut 메서드를 사용하여 지원 앱에서 사용할 바로가기를 만들고 업데이트합니다. 또한 Google 바로가기 통합 라이브러리를 앱에 추가하여 동적 링크가 Google 어시스턴트에 표시되도록 합니다.

바로가기 업데이트를 비롯한 앱 바로가기 가이드라인에 관한 자세한 내용은 바로가기 권장사항을 참고하세요.

시스템 언어 변경 처리

앱은 시스템 언어 변경을 나타내는 Intent.ACTION_LOCALE_CHANGED 브로드캐스트를 수신할 때 동적 및 고정 바로가기를 업데이트해야 합니다.

바로가기 사용 추적

정적 및 동적 바로가기가 표시되는 상황을 확인하기 위해 런처는 바로가기의 활성화 기록을 검사합니다. 정적 바로가기의 경우 다음 이벤트 중 하나가 발생할 때 reportShortcutUsed 메서드를 호출하고 바로가기 ID를 전달하여 사용자가 앱 내에서 특정 작업을 완료하는 시점을 추적할 수 있습니다.

  • 사용자가 주어진 ID로 바로가기를 선택합니다.
  • 앱 내에서 사용자가 동일한 바로가기에 해당하는 작업을 수동으로 완료합니다.

앱은 관련 이벤트가 발생할 때 pushDynamicShortcut 메서드를 호출하고 바로가기 ID를 전달하여 동적 바로가기의 사용을 추적합니다. 이 메서드를 사용하여 동적 바로가기 사용을 푸시하면 Google 어시스턴트와 같은 지원 앱이 사용자에게 관련 바로가기를 추천할 수 있습니다. pushDynamicShortcut 메서드는 호출 시 사용량을 보고하므로 동일한 바로가기에 reportShortcutUsed 메서드를 호출하지 마세요.

대화 관련 바로가기의 경우 발신 및 수신 메시지의 사용량을 추적하는 것이 중요합니다. 자세한 내용은 사용자 및 대화 권장사항을 참고하세요.

바로가기 사용 중지

앱과 사용자는 기기의 런처에 바로가기를 고정할 수 있으므로 이러한 고정된 바로가기는 사용자를 앱 내에서 오래되었거나 더 이상 존재하지 않는 작업으로 안내할 수 있습니다. 이러한 상황을 관리하려면 disableShortcuts를 호출하여 사용자가 선택하지 않도록 할 바로가기를 사용 중지하면 됩니다. 그러면 정적 및 동적 바로가기 목록에서 지정된 바로가기가 삭제되고 이러한 바로가기의 고정된 사본이 사용 중지됩니다. CharSequence를 커스텀 오류 메시지로 허용하는 이 메서드의 오버로드된 버전을 사용할 수도 있습니다. 그러면 사용자가 사용 중지된 바로가기를 실행하려고 할 때 이 오류 메시지가 표시됩니다.

비율 제한

setDynamicShortcuts, addDynamicShortcuts 또는 updateShortcuts 메서드를 사용할 때 백그라운드 앱(포그라운드에 활동이나 서비스가 없는 앱)에서 이러한 메서드를 특정 횟수만 호출할 수 있습니다. 이러한 메서드를 호출할 수 있는 특정 횟수에 대한 제한을 비율 제한이라고 합니다. 이 기능은 ShortcutManagerCompat가 기기 리소스를 과도하게 소비하지 않도록 합니다.

비율 제한이 활성화되면 isRateLimitingActive가 true를 반환합니다. 그러나 비율 제한은 특정 이벤트 중에 재설정되므로 백그라운드 앱도 비율 제한에 다시 도달할 때까지 ShortcutManager 메서드를 호출할 수 있습니다. 이러한 이벤트에는 다음이 포함됩니다.

  • 앱이 포그라운드로 옵니다.
  • 시스템 언어가 변경됩니다.
  • 사용자가 알림에서 인라인 답장 작업을 실행합니다.

개발 또는 테스트 중에 비율 제한이 발생하면 기기 설정에서 개발자 옵션 > ShortcutManager 비율 제한 재설정을 선택하거나 adb에 다음 명령어를 입력할 수 있습니다.

adb shell cmd shortcut reset-throttling [ --user your-user-id ]

백업 및 복원

앱의 매니페스트 파일에 android:allowBackup="true" 속성 할당을 포함하여 사용자가 기기를 변경할 때 앱에서 백업 및 복원 작업을 실행하도록 할 수 있습니다. 백업 및 복원을 지원하는 경우 앱 바로가기와 관련하여 다음 사항에 유의하세요.

  • 정적 바로가기는 자동으로 다시 게시되지만 사용자가 새 기기에 앱을 다시 설치한 후에만 게시됩니다.
  • 동적 바로가기는 백업되지 않으므로 사용자가 새 기기에서 앱을 열 때 다시 게시하는 로직을 앱에 포함합니다.
  • 고정된 바로가기는 기기의 런처에 자동으로 복원되지만 시스템은 고정된 바로가기와 연결된 아이콘을 백업하지 않습니다. 따라서 새 기기에서 빠르게 복원할 수 있도록 앱에 고정된 바로가기의 이미지를 저장하세요.

다음 코드 스니펫은 앱의 동적 바로가기를 복원하는 가장 좋은 방법과 앱의 고정된 바로가기가 보존되었는지 확인하는 방법을 보여줍니다.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (ShortcutManagerCompat.getDynamicShortcuts(this).isEmpty()) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.getShortcuts(this, ShortcutManagerCompat.FLAG_MATCH_PINNED).isNotEmpty()) {
                // Pinned shortcuts are restored. Use updateShortcuts() to make
                // sure they contain up-to-date information.
            }
        }
    }
    // ...
}