작업 잠금 모드

이 개발자 가이드에서는 전용 기기를 단일 기기에 잠글 수 있는 방법을 설명합니다. 특정 앱 또는 앱 집합일 수 있습니다. 엔터프라이즈 모바일 관리 (EMM)를 사용 중인 경우 개발자 또는 솔루션 통합업체가 이 가이드를 읽고 작업 잠금 모드를 계정에 솔루션을 제공합니다

개요

Android는 잠금 작업이라는 몰입형, 키오스크와 유사한 방식으로 작업을 실행할 수 있습니다. 모드로 설정합니다. 키오스크 애플리케이션을 개발 중이거나 앱 모음을 표시할 수 있습니다. 시스템이 잠금 작업으로 실행되는 경우 기기 사용자는 일반적으로 알림을 볼 수 없음, 허용 목록에 없는 앱 액세스 홈 화면으로 돌아갑니다 (홈 화면이 허용 목록에 있는 경우 제외).

기기 정책 컨트롤러 (DPC)가 허용 목록에 추가한 앱만 실행할 수 있습니다. 시스템이 작업 잠금 모드일 때 사용자가 기기를 사용한다고 해서 항상 작업 잠금 모드를 종료할 수 있는 것은 아닙니다.

작업 잠금 모드를 위해 허용 목록에 추가된 앱과 허용 목록 DPC를 허용하는 방법 해결하려는 문제에 따라 달라집니다 다음은 몇 가지 예입니다.

  • 키오스크 (콘텐츠 표시용)와 미니 DPC를 결합한 단일 앱 패키지 (작업 잠금 모드를 위해 허용 목록에 추가하기 위해)
  • 엔터프라이즈 모바일 관리 솔루션의 일부인 DPC는 고객의 모바일 앱이 작업 잠금 모드에 있는 경우

가용성

Android 5.0 이상에서는 시스템이 작업 잠금 모드로 실행될 수 있습니다. 표 1: 사용자별 앱 허용 목록을 지원하는 Android 버전을 지정합니다.

표 1. DPC 관리 모드를 위한 Android 버전 지원
Android 버전 DPC가 참고
Android 5.0(API 수준 21) 이상 완전히 관리되는 기기
Android 8.0 (API 수준 26) 이상 연결된 보조 사용자 보조 사용자는 기본 사용자와 연결되어 있어야 합니다. 자세한 내용은 여러 사용자 개요를 살펴봅니다.
Android 9.0 (API 수준 28) 이상 보조 사용자

Android 9.0 이상에서는 DPC가 앱의 활동을 잠금 작업 모드로 시작할 수 있습니다. 이전 버전에서는 앱이 이미 자체 활동 시작을 작업 잠금 모드를 탭합니다.

앱 허용 목록

DPC는 작업 잠금 모드에서 앱을 사용하려면 먼저 앱을 허용 목록에 추가해야 합니다. 전화걸기 DevicePolicyManager.setLockTaskPackages()(으)로 다음 샘플과 같이 작업 잠금 모드를 위해 앱을 허용 목록에 추가합니다.

Kotlin

// Allowlist two apps.
private val KIOSK_PACKAGE = "com.example.kiosk"
private val PLAYER_PACKAGE = "com.example.player"
private val APP_PACKAGES = arrayOf(KIOSK_PACKAGE, PLAYER_PACKAGE)

// ...

val context = context
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)
dpm.setLockTaskPackages(adminName, APP_PACKAGES)

자바

// Allowlist two apps.
private static final String KIOSK_PACKAGE = "com.example.kiosk";
private static final String PLAYER_PACKAGE = "com.example.player";
private static final String[] APP_PACKAGES = {KIOSK_PACKAGE, PLAYER_PACKAGE};

// ...

Context context = getContext();
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);
dpm.setLockTaskPackages(adminName, APP_PACKAGES);

이전에 작업 잠금 모드의 허용 목록에 추가된 앱을 찾기 위해 DPC는 다음을 호출할 수 있습니다. DevicePolicyManager.getLockTaskPackages() 기타 앱에서 전화를 걸 수 있음 DevicePolicyManager.isLockTaskPermitted() 확인 앱 패키지가 작업 잠금 모드를 지원해야 합니다.

작업 잠금 모드 시작

Android 9.0 (API 수준 28) 이상에서는 작업 잠금 모드를 탭합니다. 활동이 이미 포그라운드에서 실행 중이거나 활동을 다시 시작해야 합니다. 전화걸기 ActivityOptions.setLockTaskEnabled()를 입력하고 옵션을 선택해야 합니다. 다음 스니펫은 수행:

Kotlin

// Set an option to turn on lock task mode when starting the activity.
val options = ActivityOptions.makeBasic()
options.setLockTaskEnabled(true)

// Start our kiosk app's main activity with our lock task mode option.
val packageManager = context.packageManager
val launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE)
if (launchIntent != null) {
    context.startActivity(launchIntent, options.toBundle())
}

자바

// Set an option to turn on lock task mode when starting the activity.
ActivityOptions options = ActivityOptions.makeBasic();
options.setLockTaskEnabled(true);

// Start our kiosk app's main activity with our lock task mode option.
PackageManager packageManager = context.getPackageManager();
Intent launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE);
if (launchIntent != null) {
  context.startActivity(launchIntent, options.toBundle());
}

Android 9.0 이전 버전에서는 앱이 잠금 작업에서 자체 활동을 시작함 Activity.startLockTask() 호출 이를 호출하려면 메서드에서 실행되어야 하는 경우 활동이 포그라운드에서 실행 중이어야 합니다 (Activity-lifecycle 참조). 개념)와 유사한 특성을 가지고 있으므로 ActivityonResume() 메서드 또는 Fragment를 탭합니다. startLockTask()를 호출하는 방법은 다음과 같습니다.

Kotlin

// In our Fragment subclass.
override fun onResume() {
    super.onResume()
    // First, confirm that this package is allowlisted to run in lock task mode.
    if (dpm.isLockTaskPermitted(context.packageName)) {
        activity.startLockTask()
    } else {
        // Because the package isn't allowlisted, calling startLockTask() here
        // would put the activity into screen pinning mode.
    }
}

자바

// In our Fragment subclass.
@Override
public void onResume() {
  super.onResume();

  // First, confirm that this package is allowlisted to run in lock task mode.
  if (dpm.isLockTaskPermitted(context.getPackageName())) {
    getActivity().startLockTask();
  } else {
    // Because the package isn't allowlisted, calling startLockTask() here
    // would put the activity into screen pinning mode.
  }
}

기기가 잠겨 있을 때 작업 잠금 모드를 시작하지 않음 기기를 잠금 해제할 수 있어야 합니다. KeyguardManager 메서드를 호출하여 기기가 잠겨 있는지 확인하고 Activity 수명 주기를 사용합니다. 콜백 (예: 잠금 해제 후 호출되는 onResume())을 작업 잠금 모드를 시작하세요

작업 잠금 모드의 앱은 활동이 실행되기만 하면 새로운 활동을 시작할 수 있습니다. 새 작업을 시작하지 않습니다. 단, 허용 목록에 있는 앱을 실행하는 작업은 예외입니다. 받는사람 할 일이 활동과 어떤 관련이 있는지 알아보려면 할 일 목록 이해 및 백 스택

또는 앱의 매니페스트 파일을 앱 매니페스트에서 선언하여 파일을 참고하세요. 시스템이 작업 잠금 모드로 실행 중입니다. 시스템이 자동으로 실행되도록 하기 위해 잠금 작업 모드에서 활동을 실행하는 경우 android:lockTaskMode 속성을 다음 값으로 if_whitelisted에 부여 다음 예에 나와 있습니다.

<activity
    android:name=".MainActivity"
    android:lockTaskMode="if_whitelisted">
    <!-- ... -->
</activity>

앱 매니페스트 파일에서 옵션을 선언하는 방법에 관한 자세한 내용은 다음을 참고하세요. lockTaskMode 참조

작업 잠금 모드 중지

DPC는 허용 목록에 추가합니다. 전화걸기 DevicePolicyManager.setLockTaskPackages(), Android 6.0 (API 수준 23) 이상을 사용하고, 패키지 이름을 허용 목록 배열입니다. 허용 목록을 업데이트하면 앱이 이전 설정으로 돌아갑니다. 작업을 수행합니다.

이전에 startLockTask()를 호출한 활동은 활동이 다음을 호출할 수 있습니다. Activity.stopLockTask(): 작업 잠금 모드를 중지합니다. 이 방법 작업 잠금 모드를 시작한 활동에서만 작동합니다.

수명 주기 콜백

DPC는 앱이 (동일한 사용자로부터 실행됨) 언제 실행되는지 알면 유용할 수 있습니다. 작업 잠금 모드를 시작하고 종료합니다. 콜백을 수신하려면 다음을 재정의합니다. DPC의 DeviceAdminReceiver 서브클래스에 있는 콜백 메서드를 호출합니다.

onLockTaskModeEntering()
앱이 작업 잠금 모드로 전환된 후 호출됩니다. 여기서 패키지 이름은 앱을 pkg 인수에서 가져옵니다.
onLockTaskModeExiting()
앱이 작업 잠금 모드를 종료한 후 호출됩니다. 이 콜백은 앱 정보
를 통해 개인정보처리방침을 정의할 수 있습니다.

다른 앱을 작업 잠금 모드로 실행하면 실행 중인 웹 애플리케이션을 확인할 수 있습니다. 현재 앱이 잠금 작업에서 실행 중인지 확인 다음과 같이 ActivityManager의 메서드를 사용합니다. 예:

Kotlin

// Check if this app is in lock task mode. Screen pinning doesn't count.
var isLockTaskModeRunning = false

val activityManager = context
        .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    isLockTaskModeRunning =
            activityManager.lockTaskModeState ==
            ActivityManager.LOCK_TASK_MODE_LOCKED
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Deprecated in API level 23.
    isLockTaskModeRunning = activityManager.isInLockTaskMode
}

if (isLockTaskModeRunning) {
    // Show the exit button ...
}

자바

// Check if this app is in lock task mode. Screen pinning doesn't count.
boolean isLockTaskModeRunning = false;

ActivityManager activityManager = (ActivityManager)
    getContext().getSystemService(Context.ACTIVITY_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  isLockTaskModeRunning = activityManager.getLockTaskModeState()
      == ActivityManager.LOCK_TASK_MODE_LOCKED;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  // Deprecated in API level 23.
  isLockTaskModeRunning = activityManager.isInLockTaskMode();
}

if (isLockTaskModeRunning) {
  // Show the exit button ...
}

UI 맞춤설정

앱이 작업 잠금 모드로 실행되면 시스템 사용자 인터페이스 (UI)가 방법은 다음과 같습니다.

  • 상태 표시줄이 비어 있으며 알림과 시스템 정보가 숨겨져 있습니다.
  • 홈 및 개요 버튼은 숨겨져 있습니다.
  • 다른 앱은 새 활동을 실행할 수 없습니다.
  • 잠금 화면 (설정된 경우)이 사용 중지됩니다.

Android 9.0 이상에서 작업 잠금 모드가 사용 설정된 경우 DPC는 기기의 특정 시스템 UI 기능으로, 맞춤형 UI를 만드는 개발자에게 유용합니다. 있습니다. 전화걸기 DevicePolicyManager.setLockTaskFeatures()(그림 참조) 삽입됩니다.

Kotlin

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(
        adminName,
        DevicePolicyManager.LOCK_TASK_FEATURE_HOME or
              DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW)

자바

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(adminName,
    DevicePolicyManager.LOCK_TASK_FEATURE_HOME |
          DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW);

시스템은 flags 인수에 포함하지 않은 모든 기능을 사용 중지합니다. 이 사용 설정된 UI 기능은 작업 잠금 모드로 실행되는 동안 유지됩니다. 기기가 이미 작업 잠금 모드인 경우 할 일 잠금 기능을 변경하면 즉시 게재됩니다. 표 2에서는 맞춤설정할 수 있는 UI 기능을 설명합니다.

표 2. 작업 잠금 모드에서 맞춤설정 가능한 시스템 UI 기능
시스템 UI 기능 설명
LOCK_TASK_FEATURE_HOME 홈 버튼을 표시합니다. 맞춤 런처에 대해 사용—사용 설정된 런처를 탭함 기본 Android를 허용 목록에 추가하지 않으면 홈 버튼에 작업이 없습니다. 있습니다.
LOCK_TASK_FEATURE_OVERVIEW 최근 사용 버튼을 표시합니다. 이 버튼을 탭하면 최근 화면). 만약 이 버튼을 사용하려면 홈 버튼도 사용 설정해야 합니다.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS 키를 길게 누를 때 표시되는 전체 작업 대화상자를 사용 설정합니다. 전원 버튼 다음 경우에 사용 설정되는 유일한 기능은 setLockTaskFeatures() 호출되지 않았습니다. 사용자가 기기의 전원을 끌 수 없는 경우 이 대화상자를 사용 중지합니다.
LOCK_TASK_FEATURE_NOTIFICATIONS 모든 앱의 알림을 사용 설정합니다. 이렇게 하면 상태 표시줄, 헤드업 알림 및 확장 가능한 알림 창입니다. 이 버튼을 사용 설정하면 홈 버튼도 함께 사용 설정해야 합니다. 탭 새 패널을 여는 알림 작업 및 버튼이 잠금 상태에서 작동하지 않음 태스크 모드입니다.
LOCK_TASK_FEATURE_SYSTEM_INFO 다음과 같은 표시기가 포함된 상태 표시줄의 시스템 정보 영역을 사용 설정합니다. 연결, 배터리, 소리, 진동 옵션이 있습니다.
LOCK_TASK_FEATURE_KEYGUARD 기기에 설정된 모든 잠금 화면을 사용 설정합니다. 일반적으로 아님 정보 키오스크나 디지털 사이니지입니다.
LOCK_TASK_FEATURE_NONE 위에 나열된 모든 시스템 UI 기능을 사용 중지합니다.

DPC는 DevicePolicyManager.getLockTaskFeatures()만 받으면 됩니다. 작업 잠금 모드가 사용 설정된 경우 기기에서 사용할 수 있는 기능 목록입니다. 날짜 기기가 작업 잠금 모드를 종료하면 사용자 인터페이스가 필수 상태로 돌아갑니다. 기존 기기 정책

창 및 오버레이 차단

앱이 작업 잠금 모드로 실행되면 다른 앱과 백그라운드 서비스에서 다음 작업을 할 수 있습니다. Android가 작업 잠금 모드에서 앱 앞에 표시하는 새 창을 만듭니다. 앱과 서비스는 이러한 창을 만들어 토스트 메시지, 대화상자, 오버레이를 개인 정보를 공유할 수 있습니다. DPC는 DISALLOW_CREATE_WINDOWS 사용자 제한입니다. 다음 예는 onLockTaskModeEntering() 콜백:

Kotlin

// Called just after entering lock task mode.
override fun onLockTaskModeEntering(context: Context, intent: Intent) {
    val dpm = getManager(context)
    val admin = getWho(context)

    dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS)
}

자바

// Called just after entering lock task mode.
public void onLockTaskModeEntering(Context context, Intent intent) {
  DevicePolicyManager dpm = getManager(context);
  ComponentName admin = getWho(context);

  dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS);
}

DPC는 기기가 작업 잠금 모드를 종료할 때 사용자 제한을 제거할 수 있습니다.

추가 리소스

전용 기기에 관해 자세히 알아보려면 다음 문서를 참고하세요.