وضع قفل المهام

يشرح دليل المطوِّر هذا كيفية حصر الأجهزة المخصّصة بجهاز واحد تطبيق أو مجموعة من التطبيقات. إذا كنت تمثّل إدارة الخدمات الجوّالة للمؤسسات (EMM) وحدة تكامل الحلول أو مطوّر البرامج، يُرجى قراءة هذا الدليل لإضافة وضع قفل المهام إلى الحل.

نظرة عامة

يمكن لنظام Android تشغيل المهام في بيئة غامرة تشبه Kiosk تُسمّى مهمة القفل. . يمكنك استخدام وضع قفل المهمة إذا كنت تطور تطبيق كشك أو كمشغّل لعرض مجموعة من التطبيقات. عند تشغيل النظام في مهمة القفل لا يمكن لمستخدمي الأجهزة عادةً الاطّلاع على الإشعارات والوصول إلى التطبيقات غير المدرَجة في القائمة المسموح بها التطبيقات أو العودة إلى الشاشة الرئيسية (ما لم تتم إضافة الشاشة الرئيسية إلى القائمة المسموح بها).

لا يمكن تشغيل سوى التطبيقات المُدرَجة في القائمة المسموح بها من خلال وحدة التحكّم بسياسة الجهاز (DPC). عندما يكون النظام في وضع قفل المهمة التطبيقات مُدرَجة في القائمة المسموح بها لأن المستخدم لا يمكن أن يخرج استخدام الجهاز من وضع قفل المهمة دائمًا.

كيفية دمج التطبيق المدرَج في القائمة المسموح بها في وضع قفل المهمة وحدة التحكّم بسياسة الجهاز (DPC) المُدرَجة في القائمة المسموح بها على المشكلة التي تريد حلها. في ما يلي بعض الأمثلة:

  • يشير هذا المصطلح إلى حزمة تطبيق واحدة تجمع بين Kiosk (لتقديم المحتوى) ووحدة تحكّم بسياسة الجهاز (DPC) صغيرة. (لإضافة نفسها إلى القائمة المسموح بها في وضع قفل المهمة)
  • تعتبر وحدة التحكّم بسياسة الجهاز (DPC) جزءًا من حل إدارة التنقل للشركات، حيث تُطلق تطبيقات الأجهزة الجوّالة للعميل في وضع قفل المهمة.

مدى توفّر الخدمة

يمكن أن يعمل النظام في وضع قفل المهمة في الإصدار Android 5.0 أو الإصدارات الأحدث. يظهر الجدول 1 إصدارات Android التي تتيح إدراج التطبيقات في القائمة المسموح بها حسب المستخدم.

الجدول 1. إتاحة إصدار Android لأوضاع المشرف في وحدة التحكّم بسياسة الجهاز (DPC)
إصدار Android المشرفين على وحدة التحكّم بسياسة الجهاز ملاحظات
Android 5.0 (مستوى واجهة برمجة التطبيقات 21) أو إصدار أحدث جهاز مُدار بالكامل
Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث مستخدم ثانوي تابع يجب أن يكون المستخدم الثانوي تابعًا للمستخدم الأساسي. عرض نظرة عامة على مستخدمون متعددون
Android 9.0 (المستوى 28 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث مستخدم ثانوي

في الإصدار Android 9.0 أو الإصدارات الأحدث، يمكن لوحدة التحكّم بسياسة الجهاز (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 (المستوى 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());
}

في إصدارات Android التي تسبق الإصدار 9.0، يبدأ التطبيق أنشطته الخاصة في مهمة القفل من خلال الاتصال بالرقم Activity.startLockTask(). لإجراء مكالمة ، يجب أن يكون النشاط قيد التشغيل في المقدّمة (راجِع دورة حياة النشاط). ) لذا نقترح عليك استدعاء طريقة onResume() لـ Activity أو 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() يتم استدعاؤه بعد فتح القفل) إلى بدء وضع قفل المهمة.

يمكن لتطبيق في وضع قفل المهام بدء أنشطة جديدة ما دام النشاط لا تبدأ مهمة جديدة، باستثناء المهام التي تعمل على تشغيل تطبيق مُدرَج في القائمة المسموح بها إلى وفهم كيفية ارتباط المهام بالأنشطة، واقرأ الدليل فهم مهام Google حزمة الرجوع:

بدلاً من ذلك، يمكنك الإفصاح عنه في بيان التطبيق. ملف كيف يجب أن يتصرف النشاط عندما عمل النظام في وضع قفل المهمة. لتشغيل النظام تلقائيًا نشاطك في وضع قفل المهمة، android:lockTaskMode إلى if_whitelisted باسم كما هو موضح في المثال التالي:

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

يمكنك الحصول على مزيد من المعلومات حول عملية الإعلان عن الخيارات في ملف بيان التطبيق من خلال قراءة. المرجع lockTaskMode.

إيقاف وضع قفل المهمة

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) إيقاف وضع قفل المهمة عن بُعد من خلال إزالة حزمة التطبيق من القائمة المسموح بها. اتصل DevicePolicyManager.setLockTaskPackages()، في Android 6.0 (مستوى واجهة برمجة التطبيقات 23) أو الإصدارات الأحدث، وحذف اسم الحزمة من مصفوفة القائمة المسموح بها. وعند تعديل القائمة المسموح بها، يعود التطبيق إلى السابق. مهمة جديدة في المكدس.

إذا كان هناك نشاط يُسمى startLockTask() سابقًا، يمكن لهذا النشاط الاتصال Activity.stopLockTask() لإيقاف وضع قفل المهمة. هذه الطريقة لن تعمل سوى مع النشاط الذي بدأ وضع قفل المهمة.

عمليات معاودة الاتصال في مراحل النشاط

قد تجد وحدة التحكّم بسياسة الجهاز (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 ...
}

تخصيص واجهة المستخدم

عند تشغيل تطبيق في وضع قفل المهمة، تتغير واجهة مستخدم النظام في بالطرق التالية:

  • شريط الحالة يكون فارغًا ويتم إخفاء الإشعارات ومعلومات النظام.
  • يتم إخفاء زرَّي "الصفحة الرئيسية" و"نظرة عامة".
  • ولا يمكن للتطبيقات الأخرى تشغيل أنشطة جديدة.
  • تكون شاشة القفل (في حال ضبطها) غير مفعَّلة.

في الإصدار 9.0 من نظام Android أو الإصدارات الأحدث، عندما يكون وضع قفل المهمة مفعّلاً، يمكن لوحدة التحكّم بسياسة الجهاز (DPC) تفعيل بعض ميزات واجهة مستخدم النظام على الجهاز—مفيدة لمطوّري البرامج الذين ينشئون واجهة المستخدم. اتصل 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. تشير رسالة الأشكال البيانية تظل ميزات واجهة المستخدم المفعّلة بين عمليات التشغيل في وضع قفل المهمة. إذا كان الجهاز هو في وضع قفل المهمة، لذا فإنّ أي تغييرات تجريها على ميزات قفل المهام تظهر على الفور. يصف الجدول 2 ميزات واجهة المستخدم التي يمكنك تخصيصها.

الجدول 2. ميزات واجهة مستخدم النظام القابلة للتخصيص في وضع قفل المهمة
ميزة واجهة مستخدم النظام الوصف
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 لإيقاف جميع ميزات واجهة مستخدم النظام المذكورة أعلاه.

يمكن لوحدة التحكّم بسياسة الجهاز (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) إزالة القيود المفروضة على المستخدم عندما يخرج الجهاز من وضع قفل المهمة.

مصادر إضافية

لمعرفة المزيد من المعلومات عن الأجهزة المخصّصة، اقرأ المستندات التالية: