बहुउपयोगकर्ता-जागरूक ऐप्स का निर्माण

जब कोई डिवाइस एकाधिक उपयोगकर्ताओं का समर्थन करता है, तो उसके ऐप्स को इन विशिष्ट उपयोगकर्ताओं के बारे में अवगत कराया जाना चाहिए।

कुछ ऐप्स को कुछ घटकों को सिंगलटन के रूप में चलाने की आवश्यकता होती है और वे किसी भी उपयोगकर्ता से अनुरोध स्वीकार कर सकते हैं। वर्तमान में केवल सिस्टम ऐप्स ही इस सुविधा का उपयोग कर सकते हैं।

यह सुविधा:

  • संसाधनों का संरक्षण करता है
  • उपयोगकर्ताओं के बीच एक या अधिक साझा संसाधनों की मध्यस्थता करता है
  • एकल सर्वर कनेक्शन का उपयोग करके नेटवर्क ओवरहेड को कम करता है

एकाधिक उपयोगकर्ताओं के साथ अनुमति प्रवाह के चित्रण के लिए नीचे दिया गया चित्र देखें।

एकाधिक उपयोगकर्ता अनुमतियाँ प्रवाहित होती हैं

चित्र 1. एकाधिक उपयोगकर्ता अनुमतियाँ

सिंगलटन घटक को सक्षम करना

किसी ऐप को सिंगलटन के रूप में पहचानने के लिए, एंड्रॉइड मेनिफेस्ट में अपनी सेवा, रिसीवर या प्रदाता में android:singleUser="true" जोड़ें।

सिस्टम उस घटक को केवल उपयोगकर्ता 0 के रूप में चलने वाली प्रक्रिया में इंस्टेंट करेगा। किसी भी उपयोगकर्ता से उस प्रदाता या सेवा से जुड़ने, या उस रिसीवर को प्रसारित करने के किसी भी अनुरोध को उपयोगकर्ता 0 में प्रक्रिया में भेजा जाएगा। यदि यह आपके ऐप में एकमात्र घटक है, तो आपके ऐप का केवल एक उदाहरण चलेगा।

आपके पैकेज में गतिविधियाँ अभी भी प्रत्येक उपयोगकर्ता के लिए एक अलग प्रक्रिया में लॉन्च की जाएंगी, जिसमें यूआईडी उस उपयोगकर्ता के लिए यूआईडी रेंज में होगी (जैसे कि 1010034)।

उपयोगकर्ताओं के साथ बातचीत

अनुमतियाँ सेट करें

ये अनुमतियाँ आवश्यक हैं

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

एपीआई नियोजित करें

ऐप्स को एकाधिक उपयोगकर्ताओं से अवगत कराने के लिए निम्नलिखित API का उपयोग करें।

  1. आने वाली बाइंडर कॉल से उपयोगकर्ता हैंडल निकालें:
    • int userHandle = UserHandle.getCallingUserId()
  2. किसी विशिष्ट उपयोगकर्ता पर सेवाएँ, गतिविधियाँ, प्रसारण शुरू करने के लिए नए, संरक्षित एपीआई का उपयोग करें:
    • Context.startActivityAsUser(Intent, UserHandle)
    • Context.bindServiceAsUser(Intent, …, UserHandle)
    • Context.sendBroadcastAsUser(Intent, … , UserHandle)
    • Context.startServiceAsUser(Intent, …, UserHandle)
    UserHandle एक स्पष्ट उपयोगकर्ता या विशेष हैंडल में से एक हो सकता है: UserHandle.CURRENT या UserHandle.ALLCURRENT उस उपयोगकर्ता को इंगित करता है जो वर्तमान में अग्रभूमि में है। जब आप सभी उपयोगकर्ताओं को प्रसारण भेजना चाहते हैं तो ALL उपयोग करें।
  3. अपने स्वयं के ऐप में घटकों के साथ संचार करें: (INTERACT_ACROSS_USERS) या अन्य ऐप्स में घटकों के साथ: (INTERACT_ACROSS_USERS_FULL)
  4. आपको उपयोगकर्ता की प्रक्रिया में चलने वाले प्रॉक्सी घटकों को बनाने की आवश्यकता हो सकती है जो फिर उपयोगकर्ता 0 में singleUser घटक तक पहुंच सकते हैं।
  5. नई UserManager सिस्टम सेवा के साथ उपयोगकर्ताओं और उनके हैंडल को क्वेरी करें:
    • UserManager.getUsers()
    • UserManager.getUserInfo()
    • UserManager.supportsMultipleUsers()
    • UserManager.getUserSerialNumber(int userHandle) - एक गैर-पुनर्नवीनीकरण संख्या जो उपयोगकर्ता हैंडल से मेल खाती है।
    • UserManager.getUserHandle(int serialNumber)
    • UserManager.getUserProfiles() - स्वयं और प्रबंधित प्रोफ़ाइल, यदि कोई हो, का संग्रह लौटाता है।
  6. विशिष्ट या सभी उपयोगकर्ताओं और कॉलबैक को सुनने के लिए कंटेंटऑब्जर्वर, पैकेज मॉनिटर, ब्रॉडकास्ट रिसीवर पर नए एपीआई के साथ रजिस्टर करें जो अतिरिक्त जानकारी प्रदान करते हैं कि किस उपयोगकर्ता ने कॉलबैक का कारण बना है।

एकाधिक उपयोगकर्ताओं या प्रोफ़ाइलों में सेवाएँ

सभी सेवाओं को किसी अन्य उपयोगकर्ता या कार्य प्रोफ़ाइल में इंस्टेंस चलाने की आवश्यकता नहीं है। यदि आपकी सिस्टम सेवा को केवल उपयोगकर्ता 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() का भी उपयोग कर सकता है।