एक से ज़्यादा उपयोगकर्ताओं के लिए ऐप्लिकेशन बनाना

जब कोई डिवाइस एक से ज़्यादा उपयोगकर्ताओं के साथ काम करता है, तो उसके ऐप्लिकेशन को इन अलग-अलग उपयोगकर्ताओं के बारे में जानकारी दी जानी चाहिए.

कुछ ऐप्लिकेशन के कुछ कॉम्पोनेंट को सिंगलटन के तौर पर चलाना ज़रूरी होता है. साथ ही, वे किसी भी उपयोगकर्ता से अनुरोध स्वीकार कर सकते हैं. फ़िलहाल, सिर्फ़ सिस्टम ऐप्लिकेशन इस सुविधा का इस्तेमाल कर सकते हैं.

इस सुविधा की मदद से:

  • संसाधनों को बचाता है
  • उपयोगकर्ताओं के बीच शेयर किए गए एक या उससे ज़्यादा संसाधनों को मैनेज करता है
  • एक सर्वर कनेक्शन का इस्तेमाल करके, नेटवर्क के ओवरहेड को कम करता है

एक से ज़्यादा उपयोगकर्ताओं के साथ अनुमतियों के फ़्लो को दिखाने के लिए, नीचे दिया गया डायग्राम देखें.

एक से ज़्यादा उपयोगकर्ताओं को अनुमतियां देने का तरीका

पहली इमेज. एक से ज़्यादा उपयोगकर्ताओं को अनुमतियां देना

सिंगलटन कॉम्पोनेंट चालू करना

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

सिस्टम, उस कॉम्पोनेंट को सिर्फ़ उपयोगकर्ता 0 के तौर पर चल रही प्रोसेस में इंस्टैंशिएट करता है. किसी भी उपयोगकर्ता से, उस प्रोवाइडर या सेवा से कनेक्ट करने या उस रिसीवर पर ब्रॉडकास्ट करने का अनुरोध, उपयोगकर्ता 0 की प्रोसेस पर भेजा जाता है. अगर आपके ऐप्लिकेशन में सिर्फ़ यह कॉम्पोनेंट है, तो आपके ऐप्लिकेशन का सिर्फ़ एक इंस्टेंस चलता है.

आपके पैकेज में मौजूद गतिविधियां, अब भी हर उपयोगकर्ता के लिए अलग-अलग प्रोसेस में लॉन्च की जाती हैं. साथ ही, उन गतिविधियों का यूआईडी, उस उपयोगकर्ता के यूआईडी की रेंज में होता है, जैसे कि 1010034.

उपयोगकर्ताओं से इंटरैक्ट करना

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

ये अनुमतियां ज़रूरी हैं:

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

एपीआई का इस्तेमाल करना

ऐप्लिकेशन को एक से ज़्यादा उपयोगकर्ताओं के बारे में बताने के लिए, नीचे दिए गए एपीआई का इस्तेमाल करें.

  1. इनकमिंग Binder कॉल से उपयोगकर्ता का हैंडल निकालें:
    • 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.ALL. CURRENT से, उस उपयोगकर्ता का पता चलता है जो फ़िलहाल फ़ोरग्राउंड में है. अगर आपको सभी उपयोगकर्ताओं को ब्रॉडकास्ट भेजना है, तो 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. 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() का इस्तेमाल किया जा सकता है.