मल्टीयूज़र अवेयर ऐप्लिकेशन बनाना

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

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

यह सुविधा:

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

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

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

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

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

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

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

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

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

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

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

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

एम्प्लॉय एपीआई

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

  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.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. नए एपीआई के साथ खास या सभी उपयोगकर्ताओं और कॉलबैक को सुनने के लिए रजिस्टर करें Content Audience, 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() का इस्तेमाल करके पूरे ऐप पर.