바로가기 관리

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

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

바로가기 동작

다음 섹션에는 공개 상태, 표시 순서, 순위를 포함하여 바로가기 동작에 관한 일반적인 정보가 포함되어 있습니다.

바로가기 공개 상태

정적 바로가기 및 동적 바로가기는 사용자가 특정 동작이나 음성 명령을 실행할 때 지원되는 런처 또는 어시스턴트에 표시됩니다. 지원되는 런처에서는 동작이 앱의 런처 아이콘 길게 터치이지만 다른 런처 앱에서는 동작이 다를 수 있습니다. 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)을 호출할 때 기존 바로가기의 순위를 업데이트할 수 있습니다.

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

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

여러 인텐트 및 활동 관리

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

여러 인텐트 할당

ShortcutInfoCompat.Builder로 바로가기를 만들 때 setIntent() 대신 setIntents()를 사용할 수 있습니다. setIntents()를 호출하면 사용자가 바로가기를 선택할 때 앱 내에서 여러 활동을 실행하여 마지막 활동을 제외한 모든 활동을 백 스택의 목록에 배치할 수 있습니다. 그런 다음 사용자가 기기의 뒤로 버튼을 탭하면 기기의 런처로 돌아가지 않고 앱의 다른 활동이 표시됩니다.

다른 활동에서 활동 시작

정적 바로가기에는 맞춤 인텐트 플래그를 포함할 수 없습니다. 정적 바로가기의 첫 번째 인텐트에는 항상 Intent.FLAG_ACTIVITY_NEW_TASKIntent.FLAG_ACTIVITY_CLEAR_TASK 설정이 있습니다. 즉, 앱이 실행 중일 때 정적 바로가기가 실행되면 앱의 모든 기존 활동이 소멸됩니다. 이 동작을 원하지 않으면 다른 활동을 시작하는 보이지 않는 활동인 트램펄린 활동Activity.onCreate(Bundle) Activity.finish() 호출에서 사용할 수 있습니다.

  1. AndroidManifest.xml 파일에서 트램펄린 활동에 android:taskAffinity="" 속성 할당을 포함합니다.
  2. 바로가기 리소스 파일에서 정적 바로가기 내 인텐트의 트램펄린 활동을 참조합니다.

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

인텐트 플래그 설정

Intent 플래그 집합을 사용하여 동적 바로가기를 게시할 수 있습니다. 다른 플래그와 함께 Intent.FLAG_ACTIVITY_CLEAR_TASK를 지정하는 것이 좋습니다. 그러지 않고 앱이 실행되는 동안 다른 작업을 시작하려고 하면 타겟 활동이 표시되지 않을 수 있습니다.

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

바로가기 업데이트

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

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

다음 예에서 getMaxShortcutCountPerActivity()에서 반환된 값이 4이라고 가정합니다.

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

앱은 c1, c2, c3을 삭제해야 합니다. 동적 바로가기를 4개를 초과하여 표시할 수 없기 때문입니다. 그러나 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" 속성 할당을 포함하여 기기를 변경할 때 사용자가 앱에서 백업 및 복원 작업을 실행하도록 할 수 있습니다. 백업 및 복원을 지원하는 경우 앱 바로가기에 관한 다음 사항에 유의하세요.

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

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

Kotlin

class MyMainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (ShortcutManagerCompat.dynamicShortcuts.size == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.pinnedShortcuts.size > 0) {
                // Pinned shortcuts are restored. Use updateShortcuts() to make
                // sure they contain up-to-date information.
            }

        }
    }
    // ...
}

Java

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (ShortcutManagerCompat.getDynamicShortcuts().size() == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.getPinnedShortcuts().size() > 0) {
                // Pinned shortcuts are restored. Use pdateShortcuts() to make
                // sure they contain up-to-date information.
            }
        }
    }
    // ...
}