מצב משימות נעולות (lock task mode)

במדריך למפתחים מוסבר איך ניתן לנעול מכשירים ייעודיים במכשיר אחד אפליקציה או קבוצה של אפליקציות. אם אתם שייכים לניהול ניידות ארגונית (EMM) יוצר או משלב פתרונות, קורא את המדריך הזה כדי להוסיף מצב 'נעילת משימה' לפתרון הבעיה.

סקירה כללית

מערכת Android יכולה להריץ משימות בצורה סוחפת, דמוית קיוסק, שנקראת נעילת משימה . ייתכן שאתם משתמשים במצב משימה של נעילה אם אתם מפתחים אפליקציית "קיוסק" או מרכז אפליקציות להצגת אוסף של אפליקציות. כשהמערכת פועלת במשימה של נעילה משתמשים במכשירים בדרך כלל לא יכולים לראות התראות, לגשת שאינם ברשימת ההיתרים אפליקציות, או חוזרים למסך הבית (אלא אם מסך הבית מופיע ברשימת ההיתרים).

אפשר להריץ רק אפליקציות שנוספו לרשימת ההיתרים על ידי בקר מדיניות המכשיר (DPC) כאשר המערכת במצב 'נעילת משימה'. האפליקציות מתווספות לרשימת ההיתרים כי המשתמש או המשתמשת השימוש במכשיר לא תמיד יכול לצאת ממצב 'נעילת משימות'.

איך משלבים את האפליקציה שברשימת ההיתרים למצב משימות הנעילה עם בקר ה-DPC להוספה לרשימת ההיתרים תלויים בבעיה שרוצים לפתור. הנה כמה דוגמאות:

  • חבילת אפליקציה אחת שמשולבת בקיוסק (כדי להציג את התוכן) ובקר DPC קטן (כדי להוסיף את עצמו לרשימת ההיתרים במצב 'נעילת משימה').
  • בקר DPC שהוא חלק מפתרון לניהול ניידות ארגונית, ומשיק את האפליקציות לנייד של הלקוח במצב 'נעילה'.

זמינות

המערכת יכולה לפעול במצב 'נעילת משימות' ב-Android מגרסה 5.0 ואילך. טבלה 1 מוצגת אילו גרסאות של Android תומכות בהוספת אפליקציות לרשימת ההיתרים לפי משתמש.

טבלה 1. תמיכה בגרסת Android במצבי אדמין של בקר DPC
גרסת 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());
}

בגרסאות Android שקודמות לגרסה 9.0, אפליקציה מתחילה פעילויות משלה במשימת נעילה באמצעות הפעלה של Activity.startLockTask(). כדי להתקשר method, הפעילות חייבת לפעול בחזית (מידע נוסף זמין בקטע מחזור חיים של פעילות) ). לכן מומלץ לקרוא 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(), שנשלחת אחרי ביטול הנעילה) כדי התחלת מצב נעילת המשימה.

אפליקציה במצב 'נעילה' יכולה להתחיל פעילויות חדשות כל עוד הפעילות לא מתחיל משימה חדשה, למעט משימות שמפעילות אפליקציה שברשימת ההיתרים. שפת תרגום להבין את האופן שבו משימות קשורות לפעילויות, לקרוא את המדריך הבנת המשימות מקבץ חזרה.

לחלופין, אפשר להצהיר (declare) במניפסט של האפליקציה 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() כדי להפסיק את מצב נעילת המשימה. השיטה הזו פועל רק לפעילות שבה התחילה מצב נעילת המשימה.

קריאה חוזרת (callback) במחזור החיים

כדאי לדעת מתי אפליקציה (פועלת אצל אותו משתמש) לפי ה-DPC נכנס למצב משימת נעילה ויוצא ממנו. כדי לקבל קריאות חוזרות (callback), צריך לשנות את ההגדרות הבאות שיטות קריאה חוזרת (callback) במחלקה המשנית DeviceAdminReceiver של ה-DPC:

onLockTaskModeEntering()
התקשרות אחרי שאפליקציה נכנסת למצב 'נעילה'. אתם יכולים לקבל את שם החבילה של מהארגומנט pkg.
onLockTaskModeExiting()
בוצעה שיחה אחרי שאפליקציה יוצאת ממצב נעילה. הקריאה החוזרת הזו לא מקבלת מידע על האפליקציה.

אם מפעילים אפליקציה אחרת במצב 'נעילת משימה', צריך לעקוב אחר הריצה הסטטוס באפליקציה שלכם. כדי לבדוק אם האפליקציה הנוכחית פועלת במשימה של נעילה יש להשתמש ב-methods ב-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) של המערכת משתנה בדרכים הבאות:

  • שורת הסטטוס ריקה, וההתראות ופרטי המערכת מוסתרים.
  • הלחצנים 'דף הבית' ו'סקירה כללית' מוסתרים.
  • אפליקציות אחרות לא יכולות להפעיל פעילויות חדשות.
  • מסך הנעילה (אם הוגדר) מושבת.

ב-Android מגרסה 9.0 ואילך כשמצב 'נעילה' מופעל, בקר ה-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 יכול להסיר את הגבלת המשתמש כשהמכשיר יוצא ממצב המשימה של הנעילה.

מקורות מידע נוספים

כדי לקבל מידע נוסף על מכשירים ייעודיים, כדאי לקרוא את המסמכים הבאים: