حالت کار را قفل کنید

این راهنمای توسعه‌دهنده توضیح می‌دهد که چگونه دستگاه‌های اختصاصی را می‌توان به یک برنامه یا مجموعه‌ای از برنامه‌ها قفل کرد. اگر یک توسعه دهنده مدیریت تحرک سازمانی (EMM) یا یکپارچه ساز راه حل هستید، این راهنما را بخوانید تا حالت کار قفل را به راه حل خود اضافه کنید.

نمای کلی

Android می‌تواند وظایف را به شکلی فراگیر و کیوسک مانند به نام حالت کار قفل اجرا کند. اگر در حال توسعه یک برنامه کیوسک یا یک راه‌انداز برای ارائه مجموعه‌ای از برنامه‌ها هستید، ممکن است از حالت قفل کار استفاده کنید. وقتی سیستم در حالت کار قفل اجرا می‌شود، کاربران دستگاه معمولاً نمی‌توانند اعلان‌ها را ببینند، به برنامه‌های غیر مجاز دسترسی داشته باشند یا به صفحه اصلی بازگردند (مگر اینکه صفحه اصلی در لیست مجاز باشد).

فقط برنامه‌هایی که توسط یک کنترل‌کننده خط‌مشی دستگاه (DPC) در فهرست مجاز قرار گرفته‌اند، می‌توانند وقتی سیستم در حالت کار قفل است اجرا شوند. برنامه‌ها در فهرست مجاز هستند زیرا شخصی که از دستگاه استفاده می‌کند همیشه نمی‌تواند از حالت کار قفل خارج شود.

نحوه ترکیب برنامه لیست مجاز برای حالت کار قفل و لیست مجاز DPC به مشکلی که می خواهید حل کنید بستگی دارد. در اینجا چند نمونه آورده شده است:

  • یک بسته برنامه واحد که ترکیبی از یک کیوسک (برای ارائه محتوا) و یک مینی DPC (برای لیست مجوزهای خود برای حالت قفل کردن کار) است.
  • یک DPC که بخشی از یک راه حل مدیریت تحرک سازمانی است و برنامه های تلفن همراه مشتری را در حالت کار قفل راه اندازی می کند.

در دسترس بودن

این سیستم می‌تواند در حالت کار قفل در اندروید 5.0 یا بالاتر اجرا شود. جدول 1 نشان می دهد که کدام نسخه از Android از لیست مجوز برنامه ها بر اساس کاربر پشتیبانی می کند.

جدول 1 . پشتیبانی از نسخه اندروید برای حالت های مدیریت DPC
نسخه اندروید DPC مدیریت می کند یادداشت ها
Android 5.0 (سطح API 21) یا بالاتر دستگاه کاملاً مدیریت شده
Android 8.0 (سطح API 26) یا بالاتر کاربر ثانویه وابسته کاربر ثانویه باید به کاربر اصلی وابسته باشد. نمای کلی چند کاربر را ببینید.
Android 9.0 (سطح API 28) یا بالاتر کاربر ثانویه

در اندروید 9.0 یا جدیدتر، یک DPC می‌تواند فعالیت هر برنامه‌ای را در حالت قفل کار شروع کند. در نسخه های قبلی، برنامه از قبل باید از شروع فعالیت خود در حالت قفل کار پشتیبانی کند.

برنامه های لیست مجاز

یک DPC باید برنامه‌ها را قبل از استفاده در حالت کار قفل در لیست مجاز قرار دهد. همانطور که در نمونه زیر نشان داده شده است DevicePolicyManager.setLockTaskPackages() را برای برنامه های allowlist برای قفل کردن حالت کار فراخوانی کنید:

کاتلین

// 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() را فراخوانی کنید و این گزینه ها را هنگام شروع فعالیت ارائه دهید. قطعه زیر یک راه را نشان می دهد که می توانید این کار را انجام دهید:

کاتلین

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

در نسخه‌های اندروید قبل از 9.0، یک برنامه با فراخوانی Activity.startLockTask() فعالیت‌های خود را در حالت قفل کار شروع می‌کند. برای فراخوانی این متد، اکتیویتی باید در پیش زمینه اجرا شود ( مفاهیم چرخه عمر فعالیت را ببینید) بنابراین پیشنهاد می کنیم متد onResume() یک Activity یا Fragment را فراخوانی کنید. در اینجا نحوه فراخوانی startLockTask() آمده است:

کاتلین

// 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() که پس از باز کردن قفل فراخوانی می‌شود استفاده کنید.

یک برنامه در حالت کار قفل می‌تواند فعالیت‌های جدیدی را شروع کند تا زمانی که فعالیت کار جدیدی را شروع نکند - به جز کارهایی که یک برنامه لیست مجاز را راه‌اندازی می‌کنند. برای درک چگونگی ارتباط وظایف با فعالیت‌ها، راهنمای Understand Tasks and Back Stack را بخوانید.

همچنین، می‌توانید در فایل مانیفست برنامه خود نحوه عملکرد یک فعالیت را زمانی که سیستم در حالت کار قفل اجرا می‌شود، اعلام کنید. برای اینکه سیستم به طور خودکار فعالیت شما را در حالت lock task mode اجرا کند، ویژگی 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 شما ممکن است بداند که چه زمانی یک برنامه (که در همان کاربر اجرا می شود) وارد و خارج از حالت کار قفل می شود. برای دریافت تماس‌های برگشتی، روش‌های پاسخ به تماس زیر را در زیرکلاس DeviceAdminReceiver DPC خود لغو کنید:

onLockTaskModeEntering()
پس از ورود برنامه به حالت کار قفل تماس گرفته می شود. می توانید نام بسته یک برنامه را از آرگومان pkg دریافت کنید.
onLockTaskModeExiting()
پس از خروج برنامه از حالت کار قفل تماس گرفته می شود. این پاسخ تماس اطلاعاتی در مورد برنامه دریافت نمی کند.

اگر برنامه دیگری را در حالت قفل کار راه اندازی می کنید، باید وضعیت در حال اجرا را در برنامه خود پیگیری کنید. برای بررسی اینکه آیا برنامه فعلی در حالت قفل کار اجرا می شود، از روش های ActivityManager همانطور که در مثال زیر نشان داده شده است استفاده کنید:

کاتلین

// 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) به روش های زیر تغییر می کند:

  • نوار وضعیت با اعلان‌ها و اطلاعات سیستم پنهان است.
  • دکمه های Home و Overview پنهان هستند.
  • سایر برنامه ها نمی توانند فعالیت های جدیدی را راه اندازی کنند.
  • صفحه قفل (در صورت تنظیم) غیرفعال است.

در Android نسخه 9.0 یا بالاتر وقتی حالت کار قفل فعال است، DPC شما می‌تواند ویژگی‌های UI سیستم خاصی را در دستگاه فعال کند—برای توسعه‌دهندگانی که یک راه‌انداز سفارشی ایجاد می‌کنند مفید است. همانطور که در قطعه زیر نشان داده شده است، DevicePolicyManager.setLockTaskFeatures() را فراخوانی کنید:

کاتلین

// 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 ویژگی های رابط کاربری را که می توانید سفارشی کنید توضیح می دهد.

جدول 2 . ویژگی های رابط کاربری قابل تنظیم سیستم در حالت کار قفل
ویژگی رابط کاربری سیستم توضیحات
LOCK_TASK_FEATURE_HOME دکمه Home را نشان می دهد. فعال کردن برای راه‌اندازهای سفارشی - ضربه زدن روی دکمه هوم فعال هیچ اقدامی نمی‌کند مگر اینکه راه‌انداز پیش‌فرض Android را فهرست مجاز کنید.
LOCK_TASK_FEATURE_OVERVIEW دکمه Overview را نشان می دهد (با ضربه زدن روی این دکمه صفحه Recents باز می شود). اگر این دکمه را فعال کنید، باید دکمه Home را نیز فعال کنید.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS گفتگوی کلی اقدامات را فعال می کند که با فشار طولانی دکمه روشن/خاموش نشان داده می شود. تنها قابلیتی که وقتی setLockTaskFeatures() فراخوانی نشده باشد فعال می شود. اگر این گفتگو را غیرفعال کنید، معمولاً کاربر نمی‌تواند دستگاه را خاموش کند.
LOCK_TASK_FEATURE_NOTIFICATIONS اعلان ها را برای همه برنامه ها فعال می کند. این نشان می دهد که نمادهای اعلان در نوار وضعیت، اعلان های heads-up و سایه اعلان های قابل ارتقا را نشان می دهد. اگر این دکمه را فعال کنید، باید دکمه Home را نیز فعال کنید. ضربه زدن روی اقدامات اعلان و دکمه‌هایی که پانل‌های جدید را باز می‌کنند، در حالت کار قفل کار نمی‌کنند.
LOCK_TASK_FEATURE_SYSTEM_INFO ناحیه اطلاعات سیستم نوار وضعیت را فعال می کند که دارای نشانگرهایی مانند اتصال، باتری و گزینه های صدا و لرزش است.
LOCK_TASK_FEATURE_KEYGUARD هر صفحه قفلی را که ممکن است روی دستگاه تنظیم شود فعال می کند. معمولاً برای دستگاه‌های دارای کاربران عمومی مانند کیوسک‌های اطلاعات یا تابلوهای دیجیتال مناسب نیست.
LOCK_TASK_FEATURE_NONE همه ویژگی‌های رابط کاربری فهرست شده در بالا را غیرفعال می‌کند.

یک DPC می‌تواند DevicePolicyManager.getLockTaskFeatures() را برای دریافت لیست ویژگی‌های موجود در دستگاه هنگامی که حالت کار قفل فعال است، فراخوانی کند. هنگامی که یک دستگاه از حالت کار قفل خارج می شود، رابط کاربری به حالتی که توسط خط مشی های دستگاه موجود الزامی شده است، برمی گردد.

پنجره ها و روکش ها را مسدود کنید

وقتی یک برنامه در حالت کار قفل اجرا می‌شود، سایر برنامه‌ها و سرویس‌های پس‌زمینه می‌توانند پنجره‌های جدیدی ایجاد کنند که Android در حالت کار قفل در جلوی برنامه نمایش می‌دهد. برنامه‌ها و سرویس‌ها این پنجره‌ها را ایجاد می‌کنند تا نان تست‌ها، دیالوگ‌ها و پوشش‌ها را به شخصی که از دستگاه استفاده می‌کند نشان دهد. DPC شما می‌تواند با افزودن محدودیت کاربر DISALLOW_CREATE_WINDOWS از این موارد جلوگیری کند. مثال زیر نشان می دهد که چگونه می توانید این کار را در پاسخ به تماس onLockTaskModeEntering() انجام دهید:

کاتلین

// 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 شما می تواند محدودیت کاربر را حذف کند.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد دستگاه های اختصاصی، اسناد زیر را مطالعه کنید: