בניית אפליקציות מרובות משתמשים

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

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

המתקן הזה:

  • חוסך במשאבים
  • בורר משאב משותף אחד או יותר בין משתמשים
  • מפחית את תקורה ברשת על ידי שימוש בחיבור שרת יחיד

עיין בתרשים שלהלן לתיאור של זרימת הרשאות עם מספר משתמשים.

זרימת הרשאות משתמשים מרובות

איור 1. הרשאות משתמשים מרובות

הפעלת רכיב יחיד

כדי לזהות אפליקציה כיחידה, הוסף android:singleUser="true" לשירות, למקלט או לספק שלך במניפסט של Android.

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

הפעילויות בחבילה שלך עדיין יושקו בתהליך נפרד עבור כל משתמש, כאשר ה-UID נמצא בטווח ה-UID של אותו משתמש (כגון 1010034).

אינטראקציה עם משתמשים

הגדר הרשאות

הרשאות אלו נדרשות

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

השתמש בממשקי API

השתמש בממשקי ה-API הבאים כדי ליצור מודעות לאפליקציות מרובות.

  1. חלץ את ידית המשתמש משיחות נכנסות של Binder:
    • int userHandle = UserHandle.getCallingUserId()
  2. השתמש בממשקי API חדשים ומוגנים כדי להתחיל שירותים, פעילויות, שידורים על משתמש ספציפי:
    • Context.startActivityAsUser(Intent, UserHandle)
    • Context.bindServiceAsUser(Intent, …, UserHandle)
    • Context.sendBroadcastAsUser(Intent, … , UserHandle)
    • Context.startServiceAsUser(Intent, …, UserHandle)
    UserHandle יכול להיות משתמש מפורש או אחת מהטיפולים המיוחדים: UserHandle.CURRENT או UserHandle.ALL . CURRENT מציין את המשתמש שנמצא כעת בחזית. השתמש ב- ALL כאשר ברצונך לשלוח שידור לכל המשתמשים.
  3. תקשר עם רכיבים באפליקציה שלך: (INTERACT_ACROSS_USERS) או עם רכיבים באפליקציות אחרות: (INTERACT_ACROSS_USERS_FULL)
  4. ייתכן שיהיה עליך ליצור רכיבי proxy הפועלים בתהליך של המשתמש ולאחר מכן לגשת לרכיב singleUser במשתמש 0.
  5. שאילתות למשתמשים והטיפולים שלהם עם שירות המערכת החדש UserManager :
    • UserManager.getUsers()
    • UserManager.getUserInfo()
    • UserManager.supportsMultipleUsers()
    • UserManager.getUserSerialNumber(int userHandle) - מספר לא ממוחזר המתאים לאחיזה של המשתמש.
    • UserManager.getUserHandle(int serialNumber)
    • UserManager.getUserProfiles() - מחזיר את אוסף הפרופילים העצמיים והמנוהלים, אם יש.
  6. הירשם כדי להאזין למשתמשים ספציפיים או לכל המשתמשים וההתקשרויות עם ממשקי API חדשים ב-ContentObserver, PackageMonitor, BroadcastReceiver המספקים מידע נוסף לגבי המשתמש שגרם להתקשרות חוזרת.

שירותים במספר משתמשים או פרופילים

לא כל השירותים צריכים להפעיל מופע במשתמש אחר או בפרופיל עבודה אחר. אם שירות המערכת שלך צריך לפעול רק כמשתמש 0, השבת את רכיבי השירות כאשר הוא פועל תחת משתמשים אחרים כדי לסייע בשימור משאבים. הדוגמה הבאה מראה כיצד תוכל לעשות זאת בנקודות הכניסה של השירות שלך:

// Add on all entry points such as boot_completed or other manifest-listed receivers and providers
if (!UserManager.isSystemUser()) {
    // Disable the service
    ComponentName targetServiceName = new ComponentName(this, TargetService.class);
    context.getPackageManager().setComponentEnabledSetting(
        targetServiceName, COMPONENT_ENABLED_STATE_DISABLED, 0);
}

הדוגמה יכולה גם להשתמש ב- PackageManager.setApplicationEnabledSetting() כדי להשבית את האפליקציה כולה.