ロックタスク モード

このデベロッパー ガイドでは、専用デバイスを 1 つのデバイスにロックする方法について説明します。 1 対 1 です。企業向けモバイル管理(EMM)の場合 デベロッパーやソリューション インテグレータは、このガイドを読み、ロックタスク モードを 説明します。

概要

Android では、ロックタスクと呼ばれる没入型のキオスクのような方法でタスクを実行できます。 モード。キオスクアプリを開発する場合や ランチャーがあります。システムがロックタスクで実行されている場合 モードが有効になっていると、通常、デバイスのユーザーは通知を表示できず、許可リストに登録されていない 戻るか、ホーム画面に戻ります(ホーム画面が許可リストに登録されていない場合)。

Device Policy Controller(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)

Java

// 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())
}

Java

// 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());
}

9.0 より前のバージョンの Android では、アプリはロックタスクで独自のアクティビティを開始する モードにするには 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.
    }
}

Java

// 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() など)を ロックタスク モードを開始します。

ロックタスク モードのアプリは、アプリが動作している限り、新しいアクティビティを開始できる では、新しいタスクが開始されません。ただし、許可リストに登録されたアプリを起動するタスクは除きます。宛先 タスクがアクティビティとどのように関連しているかについては、「タスクの概要」と バックスタック

または、アプリ マニフェストで宣言します。 file に記述する必要があります。 ロックタスク モードで実行されています。システムを自動的に稼働させるため ロックタスク モードでアクティビティを起動する場合は、 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 ...
}

Java

// 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 機能(カスタム アプリケーションを作成するデベロッパーに 起動します。発信 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)

Java

// 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 [Overview] ボタンを表示します(このボタンをタップすると 履歴画面)。もし [ホーム] ボタンも有効にする必要があります。
LOCK_TASK_FEATURE_GLOBAL_ACTIONS ボタンを長押ししたときに表示されるグローバル アクション ダイアログを有効にします 電源ボタンです。Google Chat の設定で 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)
}

Java

// 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 では、デバイスのロックタスク モードが終了したときにユーザー制限を解除できます。

参考情報

専用デバイスについて詳しくは、次のドキュメントをご覧ください。