바로가기 만들기

바로가기는 사용자가 앱의 각 부분에 빠르게 액세스할 수 있도록 하여 특정 유형의 콘텐츠를 사용자에게 전달합니다.

앱 바로가기와 고정된 바로가기의 대비를 보여주는 이미지
그림 1. 앱 바로가기 및 고정된 바로가기

바로가기로 콘텐츠를 제공하는 방법은 사용 사례와 바로가기의 컨텍스트가 앱 주도인지 사용자 주도인지에 따라 다릅니다. 정적 바로가기의 컨텍스트는 변경되지 않고 동적 바로가기의 컨텍스트는 계속 변경되지만 앱은 두 경우 모두 컨텍스트를 구동합니다. 사용자가 앱에서 콘텐츠를 제공하는 방법을 선택하는 경우(예: 고정된 바로가기 사용) 컨텍스트는 사용자가 정의합니다. 다음 시나리오에서는 각 바로가기 유형의 몇 가지 사용 사례를 설명합니다.

  • 정적 바로가기 는 사용자가 앱과 상호작용하는 전체 기간 동안 일관된 구조를 사용하여 콘텐츠에 연결되는 앱에 가장 적합합니다. 대부분의 런처는 한 번에 4개의 바로가기만 표시하므로 정적 바로가기는 사용자가 캘린더나 이메일을 특정 방식으로 보려는 경우와 같이 일관된 방식으로 루틴 작업을 실행하는 데 유용합니다 .
  • 동적 바로가기는 컨텍스트에 민감한 앱의 작업에 사용됩니다. 컨텍스트 인식 바로가기는 사용자가 앱에서 실행하는 작업에 맞게 조정됩니다. 예를 들어 실행 시 사용자가 현재 레벨에서 시작할 수 있는 게임을 빌드한다면 바로가기를 자주 업데이트해야 합니다. 동적 바로가기를 사용하면 사용자가 레벨을 통과할 때마다 바로가기를 업데이트할 수 있습니다.
  • 고정된 바로가기는 사용자 중심의 특정 작업에 사용됩니다. 예를 들어 사용자가 특정 웹사이트를 런처에 고정하려고 할 수 있습니다. 이렇게 하면 사용자가 브라우저의 기본 인스턴스를 사용하는 것보다 한 번에 웹사이트로 이동하는 것과 같은 맞춤 작업을 더 빠르게 실행할 수 있으므로 유용합니다.

정적 바로가기 만들기

정적 바로가기는 앱 내의 일반 작업 링크를 제공하며 이러한 작업은 앱의 현재 버전의 전체 기간 동안 일관성을 유지해야 합니다. 정적 바로가기의 좋은 옵션으로는 보낸 메시지 보기, 알람 설정, 그날의 사용자 운동 활동 표시가 있습니다.

정적 바로가기를 만들려면 다음 단계를 따르세요.

  1. 앱의 AndroidManifest.xml 파일에서 인텐트 필터가 android.intent.action.MAIN 작업 및 android.intent.category.LAUNCHER 카테고리로 설정된 활동을 찾습니다.

  2. 앱의 바로가기가 정의된 리소스 파일을 참조하는 이 활동에 <meta-data> 요소를 추가합니다.

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                package="com.example.myapplication">
        <application ... >
          <activity android:name="Main">
            <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            
            <meta-data android:name="android.app.shortcuts"
                       android:resource="@xml/shortcuts" /> 
          </activity>
        </application>
      </manifest>
      
  3. res/xml/shortcuts.xml이라는 새 리소스 파일을 만듭니다.

  4. 새 리소스 파일에서 <shortcut> 요소 목록이 포함된 <shortcuts> 루트 요소를 추가합니다. 각 <shortcut> 요소에는 아이콘, 설명 라벨, 앱 내에서 실행하는 인텐트 등 정적 바로가기에 관한 정보를 포함합니다.

      <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
        <shortcut
          android:shortcutId="compose"
          android:enabled="true"
          android:icon="@drawable/compose_icon"
          android:shortcutShortLabel="@string/compose_shortcut_short_label1"
          android:shortcutLongLabel="@string/compose_shortcut_long_label1"
          android:shortcutDisabledMessage="@string/compose_disabled_message1">
          <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example.myapplication"
            android:targetClass="com.example.myapplication.ComposeActivity" />
          <!-- If your shortcut is associated with multiple intents, include them
               here. The last intent in the list determines what the user sees when
               they launch this shortcut. -->
          <categories android:name="android.shortcut.conversation" />
          <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
        </shortcut>
        <!-- Specify more shortcuts here. -->
      </shortcuts>
      

속성 값 맞춤설정

다음 목록에는 정적 바로가기 내의 다양한 속성에 관한 설명이 포함되어 있습니다. android:shortcutIdandroid:shortcutShortLabel 값을 제공합니다. 다른 모든 값은 선택사항입니다.

android:shortcutId

ShortcutManager 객체가 바로가기에 작업을 실행할 때 바로가기를 나타내는 문자열 리터럴입니다.

android:shortcutShortLabel

바로가기의 목적을 설명하는 간결한 구문입니다. 가능하면 이 간단한 설명을 10자(영문 기준)로 제한합니다.

자세한 내용은 setShortLabel()를 참고하세요.

android:shortcutLongLabel

바로가기의 목적을 설명하는 확장된 구문입니다. 공간이 충분하면 런처는 android:shortcutShortLabel 대신 이 값을 표시합니다. 가능하면 이 긴 설명을 25자(영문 기준)로 제한합니다.

자세한 내용은 setLongLabel()를 참고하세요.

android:shortcutDisabledMessage

사용자가 사용 중지된 바로가기를 실행하려고 할 때 지원되는 런처에 표시되는 메시지입니다. 메시지는 바로가기가 사용 중지된 이유를 사용자에게 설명해야 합니다. 이 속성 값은 android:enabledtrue이면 아무런 영향을 미치지 않습니다.

android:enabled

사용자가 지원되는 런처에서 바로가기와 상호작용할 수 있는지 여부를 결정합니다. android:enabled의 기본값은 true입니다. false로 설정하는 경우 바로가기를 사용 중지하는 이유를 설명하는 android:shortcutDisabledMessage를 설정합니다. 이러한 메시지를 제공할 필요가 없다고 생각되면 XML 파일에서 바로가기를 완전히 삭제하세요.

android:icon

런처가 사용자에게 바로가기를 표시할 때 사용하는 비트맵 또는 적응형 아이콘입니다. 이 값은 이미지 경로 또는 이미지가 포함된 리소스 파일일 수 있습니다. 가능한 경우 적응형 아이콘을 사용하여 성능과 일관성을 개선하세요.

내부 요소 구성

앱의 정적 바로가기를 나열하는 XML 파일은 각 <shortcut> 요소 내에서 다음 요소를 지원합니다. 정의하는 각 정적 바로가기의 intent 내부 요소를 포함해야 합니다.

intent

사용자가 바로가기를 선택할 때 시스템에서 실행하는 작업입니다. 이 인텐트는 android:action 속성 값을 제공해야 합니다.

단일 바로가기에 여러 인텐트를 제공할 수 있습니다. 자세한 내용은 여러 인텐트 및 활동 관리, 인텐트 설정, TaskStackBuilder 클래스 참조를 확인하세요.

categories

새로운 채팅 메시지 만들기와 같이 앱의 바로가기에서 실행하는 작업 유형의 그룹화를 제공합니다.

지원되는 바로가기 카테고리의 목록은 ShortcutInfo 클래스 참조를 확인하세요.

capability-binding

바로가기와 연결된 기능을 선언합니다.

이전 예에서 바로가기는 앱 작업 내장 인텐트인 CREATE_MESSAGE에 선언된 기능에 연결됩니다. 이 기능 결합을 통해 사용자는 Google 어시스턴트를 통해 음성 명령을 사용하여 바로가기를 호출할 수 있습니다.

동적 바로가기 만들기

동적 바로가기는 앱 내에서 컨텍스트에 민감한 특정 작업의 링크를 제공합니다. 이러한 작업은 앱 사용 간에 그리고 앱 실행 중에 변경될 수 있습니다. 동적 바로가기의 용도는 특정 사람에게 전화하거나, 특정 위치로 이동하거나, 사용자의 마지막 저장 지점에서 게임을 로드하는 것입니다. 동적 바로가기를 사용하여 대화를 열 수도 있습니다.

ShortcutManagerCompat Jetpack 라이브러리는 앱에서 동적 바로가기를 관리할 수 있는 ShortcutManager API의 도우미입니다. ShortcutManagerCompat 라이브러리를 사용하면 상용구 코드를 줄이고 바로가기가 여러 Android 버전에서 일관되게 작동할 수 있습니다. 이 라이브러리는 Google 바로가기 통합 라이브러리를 사용하여 어시스턴트와 같은 Google 표시 경로에 표시될 수 있도록 동적 바로가기를 푸시하는 데도 필요합니다.

ShortcutManagerCompat API를 사용하면 앱에서 동적 바로가기로 다음 작업을 실행할 수 있습니다.

  • 푸시 및 업데이트: pushDynamicShortcut()를 사용하여 동적 바로가기를 게시하고 업데이트합니다. ID가 동일한 동적 또는 고정된 바로가기가 이미 있는 경우 변경 가능한 각 바로가기가 업데이트됩니다.
  • 삭제: removeDynamicShortcuts()를 사용하여 동적 바로가기 세트를 삭제합니다. removeAllDynamicShortcuts()를 사용하여 모든 동적 바로가기를 삭제합니다.

바로가기에서 작업을 실행하는 방법에 관한 자세한 내용은 바로가기 관리ShortcutManagerCompat 참조를 확인하세요.

다음은 동적 바로가기를 만들어 앱에 연결하는 예입니다.

Kotlin


val shortcut = ShortcutInfoCompat.Builder(context, "id1")
        .setShortLabel("Website")
        .setLongLabel("Open the website")
        .setIcon(IconCompat.createWithResource(context, R.drawable.icon_website))
        .setIntent(Intent(Intent.ACTION_VIEW,
                Uri.parse("https://www.mysite.example.com/")))
        .build()

ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

Java


ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(context, "id1")
    .setShortLabel("Website")
    .setLongLabel("Open the website")
    .setIcon(IconCompat.createWithResource(context, R.drawable.icon_website))
    .setIntent(new Intent(Intent.ACTION_VIEW,
                   Uri.parse("https://www.mysite.example.com/")))
    .build();

ShortcutManagerCompat.pushDynamicShortcut(context, shortcut);

Google 바로가기 통합 라이브러리 추가

Google 바로가기 통합 라이브러리는 선택적인 Jetpack 라이브러리입니다. 이를 통해 런처와 같은 Android 표시 경로와 어시스턴트와 같은 Google 표시 경로에 표시할 수 있는 동적 바로가기를 푸시할 수 있습니다. 이 라이브러리를 사용하면 사용자가 바로가기를 찾아 앱에서 특정 콘텐츠에 빠르게 액세스하거나 작업을 다시 재생하는 데 도움이 됩니다.

예를 들어 메시지 앱이 'Alex'라는 사용자에게 메시지를 보낸 후에 이 연락처에 대한 동적 바로가기를 푸시할 수 있습니다. 동적 바로가기를 푸시한 후 사용자가 어시스턴트에 "Hey Google, ExampleApp에서 알렉스에게 메시지 보내 줘"라고 요청하면 어시스턴트는 ExampleApp을 실행하고 알렉스에게 메시지를 보내도록 자동으로 구성할 수 있습니다.

이 라이브러리를 사용하여 푸시된 동적 바로가기에는 기기별로 적용되는 바로가기 제한이 적용되지 않습니다. 이를 통해 사용자가 앱에서 연결된 작업을 완료할 때마다 앱이 바로가기를 푸시할 수 있습니다. 이 방법으로 자주 사용하는 바로가기를 푸시하면 Google에서 사용자의 사용 패턴을 파악하고 상황에 맞는 바로가기를 추천할 수 있습니다.

예를 들어 어시스턴트는 사용자가 일반적으로 아침에 실행하는 피트니스 추적 앱에서 푸시된 바로가기를 통해 학습하고 사용자가 아침에 휴대전화를 들면 사전에 '달리기 시작' 바로가기를 추천할 수 있습니다.

Google 바로가기 통합 라이브러리는 주소 지정 가능한 기능을 제공하지 않습니다. 이 라이브러리를 앱에 추가하면 Google 표시 경로에서 ShortcutManagerCompat를 사용하여 앱이 푸시하는 바로가기를 사용할 수 있습니다.

앱에서 이 라이브러리를 사용하려면 다음 단계를 따르세요.

  1. AndroidX 라이브러리를 지원하도록 gradle.properties 파일을 업데이트합니다.

          
          android.useAndroidX=true
          # Automatically convert third-party libraries to use AndroidX
          android.enableJetifier=true
          
          
  2. app/build.gradle에서 Google 바로가기 통합 라이브러리 및 ShortcutManagerCompat의 종속 항목을 추가합니다.

          
          dependencies {
            implementation "androidx.core:core:1.6.0"
            implementation 'androidx.core:core-google-shortcuts:1.0.0'
            ...
          }
          
          

라이브러리 종속 항목이 Android 프로젝트에 추가되면 앱에서 ShortcutManagerCompatpushDynamicShortcut() 메서드를 사용하여 런처 및 참여하는 Google 표시 경로에 표시할 수 있는 동적 바로가기를 푸시할 수 있습니다.

고정된 바로가기 만들기

Android 8.0(API 수준 26) 이상에서 고정된 바로가기를 만들 수 있습니다. 정적 및 동적 바로가기와 달리 고정된 바로가기는 지원되는 런처에 별도의 아이콘으로 표시됩니다. 그림 1은 이 두 가지 바로가기 유형의 차이점을 보여줍니다.

앱을 사용하여 지원되는 런처에 바로가기를 고정하려면 다음 단계를 완료하세요.

  1. isRequestPinShortcutSupported()를 사용하여 기기의 기본 런처가 인앱 바로가기 고정을 지원하는지 확인합니다.
  2. 바로가기가 있는지에 따라 다음 두 가지 방법 중 하나로 ShortcutInfo 객체를 만듭니다.

    1. 바로가기가 있는 경우 기존 바로가기의 ID만 포함된 ShortcutInfo 객체를 만듭니다. 시스템에서 바로가기와 관련된 다른 모든 정보를 자동으로 찾아 고정합니다.
    2. 새 바로가기를 고정하는 경우 새 바로가기의 ID, 인텐트, 짧은 라벨이 포함된 ShortcutInfo 객체를 만듭니다.
  3. requestPinShortcut()를 호출하여 바로가기를 기기의 런처에 고정합니다. 이 프로세스 중에 바로가기가 성공적으로 고정될 때만 앱에 알리는 PendingIntent 객체를 전달할 수 있습니다.

    바로가기가 고정되면 앱에서 updateShortcuts() 메서드를 사용하여 바로가기의 콘텐츠를 업데이트할 수 있습니다. 자세한 내용은 바로가기 업데이트를 참고하세요.

다음 코드 스니펫은 고정된 바로가기를 만드는 방법을 보여줍니다.

Kotlin

val shortcutManager = getSystemService(ShortcutManager::class.java)

if (shortcutManager!!.isRequestPinShortcutSupported) {
    // Enable the existing shortcut with the ID "my-shortcut".
    val pinShortcutInfo = ShortcutInfo.Builder(context, "my-shortcut").build()

    // Create the PendingIntent object only if your app needs to be notified
    // that the user let the shortcut be pinned. If the pinning operation fails,
    // your app isn't notified. Assume here that the app implements a method
    // called createShortcutResultIntent() that returns a broadcast intent.
    val pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo)

    // Configure the intent so that your app's broadcast receiver gets the
    // callback successfully. For details, see PendingIntent.getBroadcast().
    val successCallback = PendingIntent.getBroadcast(context, /* request code */ 0,
            pinnedShortcutCallbackIntent, /* flags */ 0)

    shortcutManager.requestPinShortcut(pinShortcutInfo,
            successCallback.intentSender)
}

Java

ShortcutManager shortcutManager =
        context.getSystemService(ShortcutManager.class);

if (shortcutManager.isRequestPinShortcutSupported()) {
    // Enable the existing shortcut with the ID "my-shortcut".
    ShortcutInfo pinShortcutInfo =
            new ShortcutInfo.Builder(context, "my-shortcut").build();

    // Create the PendingIntent object only if your app needs to be notified
    // that the user let the shortcut be pinned. If the pinning operation fails,
    // your app isn't notified. Assume here that the app implements a method
    // called createShortcutResultIntent() that returns a broadcast intent.
    Intent pinnedShortcutCallbackIntent =
            shortcutManager.createShortcutResultIntent(pinShortcutInfo);

    // Configure the intent so that your app's broadcast receiver gets the
    // callback successfully. For details, see PendingIntent.getBroadcast().
    PendingIntent successCallback = PendingIntent.getBroadcast(context, /* request code */ 0,
            pinnedShortcutCallbackIntent, /* flags */ 0);

    shortcutManager.requestPinShortcut(pinShortcutInfo,
            successCallback.getIntentSender());
}

맞춤 바로가기 활동 만들기

&#39;홈 화면에 Gmail 런처 아이콘을 추가하시겠어요?&#39;라는 메시지를 표시하는 맞춤 대화상자 활동을 보여주는 이미지입니다. 맞춤 옵션은 &#39;아니요&#39;와 &#39;아이콘 추가&#39;입니다.
그림 2. 맞춤 앱 바로가기 대화상자 활동의 예

사용자가 맞춤 옵션과 확인 버튼이 있는 바로가기를 만드는 데 도움이 되는 특수 활동을 만들 수도 있습니다. 그림 2는 Gmail 앱에서 이러한 유형의 활동을 보여주는 예를 보여줍니다.

앱의 매니페스트 파일에서 활동의 <intent-filter> 요소에 ACTION_CREATE_SHORTCUT를 추가합니다. 이 선언은 사용자가 바로가기를 만들려고 할 때 다음 동작을 설정합니다.

  1. 시스템이 앱의 특수 활동을 시작합니다.
  2. 사용자가 바로가기 옵션을 설정합니다.
  3. 사용자가 확인 버튼을 선택합니다.
  4. 앱에서 createShortcutResultIntent() 메서드를 사용하여 바로가기를 만듭니다. 이 메서드는 Intent를 반환하며 앱은 setResult()를 사용하여 이전에 실행한 활동에 다시 릴레이합니다.
  5. 앱은 맞춤설정된 바로가기를 만드는 데 사용된 활동에서 finish()를 호출합니다.

마찬가지로 앱은 설치 후 또는 앱을 처음 실행할 때 사용자에게 홈 화면에 고정된 바로가기를 추가하라는 메시지를 표시할 수 있습니다. 이 방법은 사용자가 바로가기를 일반적인 워크플로의 일부로 만드는 데 도움이 되므로 효과적입니다.

단축키 테스트

앱의 바로가기를 테스트하려면 바로가기를 지원하는 런처가 있는 기기에 앱을 설치하세요. 그후에 다음 작업을 실행합니다.

  • 앱의 런처 아이콘을 길게 터치하여 앱에 정의한 바로가기를 확인합니다.
  • 바로가기를 드래그하여 기기의 런처에 고정합니다.