앱의 맞춤 빠른 설정 타일 만들기

빠른 설정은 빠른 설정 패널에 표시되는 타일입니다. 사용자가 탭하여 반복 작업을 빠르게 완료할 수 있도록 합니다. 앱에서 TileService를 통해 사용자에게 맞춤 카드를 제공할 수 있습니다. 클래스를 사용하고 Tile 객체를 사용하여 카드의 상태를 추적합니다. 예를 들어 사용자가 앱에서 제공하는 VPN을 켜거나 사용 중지되어 있습니다.

VPN 타일이 사용 설정된 빠른 설정 패널
  켜고 끄기
그림 1. VPN 타일이 사용 설정된 빠른 설정 패널 사용할 수 있습니다.
를 통해 개인정보처리방침을 정의할 수 있습니다.

카드를 만들 시점 결정

사용자가 기대하는 특정 기능의 카드를 만드는 것이 좋습니다. 또는 둘 다에 빠르게 액세스해야 하는 경우에 적합합니다. 가장 효과적인 타일은 이 두 가지 특성에 모두 일치하는 것으로, 자주 수행하는 작업에 적합합니다

예를 들어 피트니스 앱의 카드를 만들어 사용자가 운동 세션을 빠르게 시작할 수 있습니다. 하지만 카드를 새로 만들지 않는 것이 좋습니다. 사용자가 전체 운동 기록을 검토할 수 있습니다.

피트니스 앱 카드 사용 사례
그림 2. 피트니스 앱의 권장 타일과 권장되지 않는 카드의 예
를 통해 개인정보처리방침을 정의할 수 있습니다.

카드의 검색 가능성과 사용 편의성을 개선하려면 피해야 할 사항:

  • 카드를 사용하여 앱을 실행하지 않도록 하세요. 앱 바로가기 또는 표준 대신 런처를 사용하세요.

  • 일회성 사용자 작업에 카드를 사용하지 마세요. 앱 바로가기 또는 notification을 대신 표시합니다.

  • 너무 많은 타일을 만들지 않도록 하세요. 앱당 최대 2개를 사용하는 것이 좋습니다. 사용 앱 바로가기를 사용하세요.

  • 정보를 표시하지만 있습니다. 대신 알림이나 위젯을 사용하세요.

카드 만들기

카드를 만들려면 먼저 적절한 타일 아이콘을 만든 다음, 앱의 매니페스트 파일에서 TileService를 만들고 선언합니다.

빠른 설정 샘플에서는 카드를 관리할 수 있습니다.

맞춤 아이콘 만들기

빠른 탭의 타일에 표시되는 맞춤 아이콘을 제공해야 합니다. 설정 패널 TileService를 선언할 때 이 아이콘을 추가합니다. 다음 섹션에 설명되어 있습니다.) 아이콘은 흰색으로 계속 켜져 있어야 하며 크기가 24 x 24dp이고 VectorDrawable

벡터 드로어블의 예
그림 3. 벡터 드로어블의 예

카드의 용도를 시각적으로 암시하는 아이콘을 만듭니다. 이를 통해 사용자는 타일이 자신의 필요에 맞는지 쉽게 확인할 수 있습니다. 예를 들어, 사용자가 피트니스 앱을 시작할 수 있는 피트니스 앱 카드의 스톱워치 아이콘 운동 세션입니다.

TileService 생성 및 선언

TileService 클래스를 확장하는 카드 서비스를 만듭니다.

Kotlin

class MyQSTileService: TileService() {

  // Called when the user adds your tile.
  override fun onTileAdded() {
    super.onTileAdded()
  }
  // Called when your app can update your tile.
  override fun onStartListening() {
    super.onStartListening()
  }

  // Called when your app can no longer update your tile.
  override fun onStopListening() {
    super.onStopListening()
  }

  // Called when the user taps on your tile in an active or inactive state.
  override fun onClick() {
    super.onClick()
  }
  // Called when the user removes your tile.
  override fun onTileRemoved() {
    super.onTileRemoved()
  }
}

자바

public class MyQSTileService extends TileService {

  // Called when the user adds your tile.
  @Override
  public void onTileAdded() {
    super.onTileAdded();
  }

  // Called when your app can update your tile.
  @Override
  public void onStartListening() {
    super.onStartListening();
  }

  // Called when your app can no longer update your tile.
  @Override
  public void onStopListening() {
    super.onStopListening();
  }

  // Called when the user taps on your tile in an active or inactive state.
  @Override
  public void onClick() {
    super.onClick();
  }

  // Called when the user removes your tile.
  @Override
  public void onTileRemoved() {
    super.onTileRemoved();
  }
}

앱의 매니페스트 파일에서 TileService를 선언합니다. 이름 및 라벨 추가 이전 섹션에서 만든 맞춤 아이콘인 TileService의 적절한 권한이 있어야 합니다.

 <service
     android:name=".MyQSTileService"
     android:exported="true"
     android:label="@string/my_default_tile_label"  // 18-character limit.
     android:icon="@drawable/my_default_icon_label"
     android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
     <intent-filter>
         <action android:name="android.service.quicksettings.action.QS_TILE" />
     </intent-filter>
 </service>

TileService 관리

TileService를 만들고 앱 매니페스트에서 선언한 후에는 상태를 관리해야 합니다

TileService바인드된 서비스입니다. TileService이(가) 바인딩되는 경우 통신해야 하는지 여부를 알려줍니다. 일반적인 bound-service 수명 주기에는 다음과 같은 네 가지 콜백 메서드가 포함됩니다. onCreate(), onBind(), onUnbind()onDestroy() 이러한 메서드는 새로운 수명 주기 단계에 진입합니다

TileService 수명 주기 개요

바인드된 서비스 수명 주기를 제어하는 콜백 외에 TileService 수명 주기와 관련된 다른 메서드를 구현합니다. 이러한 메서드 onCreate()onDestroy() 외부에서 호출될 수 있습니다. Service 수명 주기 메서드와 TileService 수명 주기 메서드는 두 가지로 호출됩니다. 별도의 비동기 스레드가 필요합니다.

TileService 수명 주기에는 호출되는 다음 메서드가 포함됩니다. TileService가 새로운 수명 주기 단계에 진입할 때마다 시스템에서 다음을 수행합니다.

  • onTileAdded(): 이 메서드는 사용자가 사용자가 타일을 제거했다가 다시 추가하는 경우입니다. 이때가 일회성 초기화를 수행하는 것이 가장 좋습니다. 그러나 필요한 모든 초기화를 충족하지 못할 수 있습니다.

  • onStartListening()onStopListening(): 이러한 메서드는 앱에서 카드를 업데이트할 때마다 호출되며 자주 호출됩니다. 이 TileService이(가) onStartListening()과(와) 사이에 바인딩됨 onStopListening(): 앱에서 카드를 수정하고 업데이트를 푸시할 수 있습니다.

  • onTileRemoved(): 이 메서드는 사용자가 타일이 될 수도 있습니다.

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

듣기 모드 선택

TileService활성 모드 또는 비활성 모드에서 수신 대기합니다. 권장 조치 앱 매니페스트에서 선언해야 합니다. 그렇지 않으면 TileService는 표준 모드이므로 선언할 필요가 없습니다.

TileService이(가) onStartListening() 외부에 있을 것이라고 가정하지 않습니다. onStopListening() 메서드 쌍입니다.

상태를 수신 대기하고 모니터링하는 TileService에 활성 모드를 사용합니다. 실행할 수 있습니다 활성 모드의 TileServiceonTileAdded()에 바인딩됩니다. onTileRemoved(), 탭 이벤트, 앱 프로세스에서 요청하는 경우

카드 상태에 따라 TileService에 알림이 전송되면 활성 모드를 사용하는 것이 좋습니다. 자체 프로세스로 업데이트해야 합니다 활성 타일은 시스템 설정을 변경할 필요가 없기 때문에 빠른 설정 패널을 사용자에게 표시됩니다.

정적 TileService.requestListeningState() 메서드를 호출하여 수신 대기 상태의 시작을 요청하고 onStartListening()입니다.

META_DATA_ACTIVE_TILE를 다음과 같이 추가하여 활성 모드를 선언할 수 있습니다. 매니페스트 파일에 포함됩니다.

<service ...>
    <meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
         android:value="true" />
    ...
</service>

비활성 모드

비활성 모드가 표준 모드입니다. 다음과 같은 경우 TileService는 비활성 모드입니다. 타일이 사용자에게 표시될 때마다 바인딩됩니다. 즉, TileService는 때때로 통제할 수 없는 수준으로 생성되고 다시 결합될 수 있습니다. 그것은 또한 사용자가 타일을 보고 있지 않을 때는 바인딩 해제되어 소멸될 수 있습니다.

사용자가 앱을 열면 앱에서 onStartListening() 콜백을 수신합니다. 빠른 설정 패널 Tile 객체는 원하는 만큼 업데이트할 수 있습니다. onStartListening()에서 onStopListening() 사이로 설정해야 합니다.

비활성 모드를 선언할 필요가 없습니다. META_DATA_ACTIVE_TILE을 앱의 매니페스트 파일에 추가합니다.

타일 상태 개요

사용자가 카드를 추가한 후에는 항상 다음 상태 중 하나로 존재합니다.

  • STATE_ACTIVE: 켜짐 또는 사용 설정됨 상태를 나타냅니다. 사용자는 다음을 수행할 수 있습니다. 타일과 상호작용할 수 있습니다.

    예를 들어 사용자가 시간이 지정된 운동을 시작할 수 있는 피트니스 앱 카드의 경우 STATE_ACTIVE는 사용자가 운동을 시작했음을 의미합니다. 세션이 실행되고 있고 타이머가 실행되고 있습니다.

  • STATE_INACTIVE: 꺼짐 또는 일시중지 상태를 나타냅니다. 사용자는 다음을 수행할 수 있습니다. 타일과 상호작용할 수 있습니다.

    피트니스 앱 카드 예시를 다시 사용하려면 STATE_INACTIVE의 카드는 다음과 같습니다. 사용자가 운동 세션을 시작하지 않았지만 운동 세션을 시작할 수 있는 경우 생각해 봤습니다.

  • STATE_UNAVAILABLE: 일시적으로 사용할 수 없는 상태를 나타냅니다. 이 사용자는 이 상태에 있는 동안 카드와 상호작용할 수 없습니다.

    예를 들어 STATE_UNAVAILABLE의 타일은 어떤 이유로든 사용자가 현재 사용할 수 있습니다.

시스템은 Tile 객체의 초기 상태만 설정합니다. Tile 설정 객체의 상태를 설명합니다.

시스템에서 타일 아이콘과 배경에 색조를 조정하여 Tile 객체. STATE_ACTIVE로 설정된 Tile 객체가 가장 어둡고 STATE_INACTIVESTATE_UNAVAILABLE가 점점 더 가벼워집니다. 정확한 색조 제조업체 및 버전에 따라 다릅니다

객체 상태를 반영하도록 색조가 조정된 VPN 타일
그림 4. 타일 상태 (각각 활성, 비활성, 사용 불가 상태)를 반영하도록 색조가 조정된 타일의 예

카드 업데이트

onStartListening() 콜백을 받으면 카드를 업데이트할 수 있습니다. 타일의 모드에 따라 타일은 onStopListening()에 대한 콜백을 수신합니다.

활성 모드에서는 타일을 받기 전에 정확히 한 번 카드를 업데이트할 수 있습니다. onStopListening()의 콜백입니다. 비활성 모드에서는 카드를 onStartListening()에서 onStopListening() 사이로 원하는 만큼 반복합니다.

getQsTile()를 호출하여 Tile 객체를 검색할 수 있습니다. 업데이트 방법 Tile 객체의 특정 필드에 전달하려면 다음 메서드를 호출합니다.

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

설정을 완료하면 updateTile()를 호출하여 타일을 업데이트해야 합니다. Tile 객체의 필드를 올바른 값으로 변경합니다. 이렇게 하면 시스템이 업데이트된 카드 데이터를 파싱하고 UI를 업데이트합니다.

Kotlin

data class StateModel(val enabled: Boolean, val label: String, val icon: Icon)

override fun onStartListening() {
  super.onStartListening()
  val state = getStateFromService()
  qsTile.label = state.label
  qsTile.contentDescription = tile.label
  qsTile.state = if (state.enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE
  qsTile.icon = state.icon
  qsTile.updateTile()
}

자바

public class StateModel {
  final boolean enabled;
  final String label;
  final Icon icon;

  public StateModel(boolean e, String l, Icon i) {
    enabled = e;
    label = l;
    icon = i;
  }
}

@Override
public void onStartListening() {
  super.onStartListening();
  StateModel state = getStateFromService();
  Tile tile = getQsTile();
  tile.setLabel(state.label);
  tile.setContentDescription(state.label);
  tile.setState(state.enabled ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
  tile.setIcon(state.icon);
  tile.updateTile();
}

탭 처리

카드가 다음 안에 있는 경우 사용자는 타일을 탭하여 작업을 트리거할 수 있습니다. STATE_ACTIVE 또는 STATE_INACTIVE 그러면 시스템이 앱의 onClick() 콜백에 전달됩니다.

앱이 onClick() 콜백을 수신하면 대화상자를 실행하거나 백그라운드 작업을 트리거하거나 카드의 상태를 변경할 수 있습니다.

Kotlin

var clicks = 0
override fun onClick() {
  super.onClick()
  counter++
  qsTile.state = if (counter % 2 == 0) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE
  qsTile.label = "Clicked $counter times"
  qsTile.contentDescription = qsTile.label
  qsTile.updateTile()
}

자바

int clicks = 0;

@Override
public void onClick() {
  super.onClick();
  counter++;
  Tile tile = getQsTile();
  tile.setState((counter % 2 == 0) ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
  tile.setLabel("Clicked " + counter + " times");
  tile.setContentDescription(tile.getLabel());
  tile.updateTile();
}

대화상자 시작

showDialog(): 빠른 설정 패널을 접고 대화상자를 표시합니다. 추가 입력이 필요한 경우 대화상자를 사용하여 작업에 컨텍스트를 추가합니다. 또는 사용자 동의가 있어야 합니다.

활동 시작

startActivityAndCollapse()는 패널을 닫습니다 활동은 표시할 자세한 정보가 있을 때 유용합니다. 대화형 환경을 조성하는 경우가 많죠.

앱에 상당한 사용자 상호작용이 필요한 경우 최후의 수단으로만 사용하지 마세요. 대신 대화상자나 전환 버튼을 사용해 보세요.

타일을 길게 탭하면 앱 정보 화면이 표시됩니다. 재정의 대신 환경설정 설정을 위한 활동을 실행하고, 다음 활동이 포함된 활동 중 하나에 <intent-filter>하세요. ACTION_QS_TILE_PREFERENCES

Android API 28부터 PendingIntentIntent.FLAG_ACTIVITY_NEW_TASK가 있어야 합니다.

if (Build.VERSION.SDK_INT >= 28) {
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}

또는 AndroidManifest.xml에 플래그를 특정 Activity 섹션.

카드를 전환 가능으로 표시

타일이 주로 2개 상태 스위치 (카드의 가장 일반적인 동작)를 전달합니다. 이렇게 하면 운영체제에 카드의 동작에 대한 정보를 제공하고 전반적인 접근성을 개선할 수 있습니다.

TOGGLEABLE_TILE 메타데이터를 true로 설정하여 카드를 전환 가능한 것으로 표시합니다.

<service ...>
  <meta-data android:name="android.service.quicksettings.TOGGLEABLE_TILE"
    android:value="true" />
</service>

안전하게 잠긴 기기에서만 안전한 작업 실행

잠긴 기기에서는 타일이 잠금 화면 상단에 표시될 수 있습니다. 타일이 민감한 정보가 포함되어 있습니다. isSecure() 값을 확인하여 기기가 안전한 상태인지 판단하고 TileService는 적절하게 변경할 수 있습니다

잠긴 상태에서도 타일 작업을 실행해도 안전한 경우 startActivity()를 사용합니다. 잠금 화면 맨 위에서 활동을 시작할 수 있습니다.

카드 작업이 안전하지 않은 경우 unlockAndRun()를 사용하여 사용자에게 다음 안내를 따르세요. 기기를 잠금 해제합니다. 성공하면 시스템은 여기에 전달하는 Runnable 객체입니다. 메서드를 사용하여 축소하도록 요청합니다.

사용자에게 카드를 추가하라는 메시지 표시

카드를 수동으로 추가하려면 사용자는 몇 가지 단계를 따라야 합니다.

  1. 아래로 스와이프하여 빠른 설정 패널을 엽니다.
  2. 수정 버튼을 탭합니다.
  3. 친구가 내 타일을 찾을 때까지 기기의 모든 타일을 스크롤합니다.
  4. 타일을 누른 상태에서 활성 타일 목록으로 드래그합니다.

사용자는 언제든지 타일을 이동하거나 제거할 수 있습니다.

Android 13부터 requestAddTileService() 메서드를 사용할 수 있습니다. 를 사용하면 사용자가 카드를 기기에 훨씬 더 쉽게 추가할 수 있습니다. 이 방법 사용자에게 타일을 바로 빠른 설정 패널 프롬프트에는 애플리케이션 이름, 제공된 라벨, 아이콘을 탭합니다.

<ph type="x-smartling-placeholder">
</ph> 빠른 설정 배치 API 프롬프트
그림 5. 빠른 설정 배치 API 프롬프트
public void requestAddTileService (
  ComponentName tileServiceComponentName,
  CharSequence tileLabel,
  Icon icon,
  Executor resultExecutor,
  Consumer<Integer> resultCallback
)

콜백에는 타일이 추가되었는지 여부에 대한 정보가 포함됩니다. 오류가 발생했는지 여부를 알려줍니다.

사용자에게 메시지를 표시할 시점과 빈도를 신중하게 결정하세요. 다음과 같은 상황에서만 requestAddTileService() 호출을 권장합니다. 사용자가 카드에서 지원하는 기능과 처음 상호작용할 때

시스템은 특정 날짜에 대한 요청 처리를 중지하도록 선택할 수 있으며 ComponentName 이전에 사용자가 여러 번 거부한 경우 이 사용자는 이Context 현재 사용자와 일치해야 합니다.