इस गाइड में, ऐप्लिकेशन के बैकग्राउंड में चलने के दौरान, पेरिफ़रल डिवाइसों के साथ कम्यूनिकेट करने के मुख्य इस्तेमाल के उदाहरणों के साथ-साथ, उन्हें इस्तेमाल करने के तरीके के बारे में खास जानकारी दी गई है:
इनमें से हर इस्तेमाल के उदाहरण के लिए, कई विकल्प उपलब्ध हैं. हर एक के फ़ायदे और नुकसान होते हैं. इनसे यह तय होता है कि वे आपकी ज़रूरतों के हिसाब से कितने सही हैं.
इस डायग्राम में, इस पेज पर दिए गए दिशा-निर्देशों को आसानी से समझा जा सकता है:
कोई डिवाइस ढूंढें
सबसे पहले, आपके ऐप्लिकेशन को कनेक्ट करने के लिए कोई डिवाइस ढूंढना होगा. BLE डिवाइस ढूंढने के लिए, इनमें से किसी एक एपीआई का इस्तेमाल किया जा सकता है:
BluetoothLeScanner
, जैसा कि बीएलई डिवाइसों को ढूंढना में बताया गया है. (सैंपल)CompanionDeviceManager
, जैसा कि कंपैनियन डिवाइस को जोड़ने में बताया गया है. (सैंपल)
बैकग्राउंड में
ऐप्लिकेशन के दिखने के दौरान, इनमें से किसी भी एपीआई का इस्तेमाल करने पर कोई पाबंदी नहीं है. हालांकि, इन दोनों एपीआई के लिए ज़रूरी है कि आपके ऐप्लिकेशन की प्रोसेस चालू हो. अगर ऐप्लिकेशन प्रोसेस नहीं चल रही है, तो नीचे दिए गए तरीके आज़माएं:
BluetoothLeScanner
के लिए:startScan()
को कॉल करने के लिए,ScanCallback
ऑब्जेक्ट के बजायPendingIntent
ऑब्जेक्ट का इस्तेमाल करें. इससे, आपके फ़िल्टर से मैच करने वाले डिवाइस के स्कैन होने पर सूचना मिलेगी. (सैंपल)CompanionDeviceManager
के लिए: ऐप्लिकेशन को चालू करने और पहले से कनेक्ट किए गए डिवाइस के आस-पास होने पर उसे चालू रखने के लिए, साथी ऐप्लिकेशन चालू रखें में दिए गए निर्देशों का पालन करें. (सैंपल)
किसी डिवाइस से कनेक्ट करें
किसी डिवाइस को ढूंढने के बाद उससे कनेक्ट करने के लिए, आपको इनमें से किसी एक सोर्स से उस डिवाइस का BluetoothDevice
इंस्टेंस पाना होगा:
- पिछले सेक्शन में बताए गए तरीके से
BluetoothLeScanner
स्कैन का नतीजा. BluetoothAdapter.getBondedDevices()
से मिली, बंधे हुए डिवाइसों की सूची.BluetoothAdapter
का कैश मेमोरी,BluetoothAdapter.getRemoteLeDevice()
का इस्तेमाल करके.
BluetoothDevice
इंस्टेंस मिलने के बाद, उससे जुड़े डिवाइस से कनेक्ट करने का अनुरोध किया जा सकता है. इसके लिए, connectGatt()
में से किसी एक तरीके का इस्तेमाल करें. autoConnect
बूलियन में दी गई वैल्यू से यह तय होता है कि GATT क्लाइंट, कनेक्शन के इन दोनों मोड में से किसका इस्तेमाल करता है:
- डायरेक्ट कनेक्शन (
autoconnect = false
): सहायक डिवाइस से सीधे कनेक्ट करने की कोशिश करें. अगर डिवाइस उपलब्ध नहीं है, तो कनेक्ट नहीं हो पाएगा. डिसकनेक्ट होने पर, GATT क्लाइंट अपने-आप फिर से कनेक्ट होने की कोशिश नहीं करता. - अपने-आप कनेक्ट होना (
autoconnect = true
): जब भी कोई डिवाइस उपलब्ध हो, तो उससे अपने-आप कनेक्ट होने की कोशिश करें. अगर डिवाइस से कनेक्ट करने वाला डिवाइस, कनेक्टिविटी बंद कर देता है या डिवाइस कनेक्टिविटी की रेंज से बाहर हो जाता है, तो GATT क्लाइंट, डिवाइस के उपलब्ध होने पर अपने-आप फिर से कनेक्ट होने की कोशिश करता है.
बैकग्राउंड में
ऐप्लिकेशन बैकग्राउंड में होने पर, किसी डिवाइस से कनेक्ट करने पर कोई पाबंदी नहीं है. हालांकि, प्रोसेस बंद होने पर कनेक्शन बंद हो जाता है. इसके अलावा, बैकग्राउंड से गतिविधियां शुरू करने (Android 10 और इसके बाद के वर्शन में) या फ़ोरग्राउंड सेवाएं (Android 12 और इसके बाद के वर्शन में) शुरू करने पर पाबंदियां हैं.
इसलिए, बैकग्राउंड में कनेक्शन करने के लिए, ऐप्लिकेशन इन तरीकों का इस्तेमाल कर सकते हैं:
- अपने डिवाइस से कनेक्ट करने के लिए, WorkManager का इस्तेमाल करें.
- कोई कार्रवाई करने के लिए,
PeriodicWorkRequest
याOneTimeWorkRequest
सेट किया जा सकता है. हालांकि, ऐप्लिकेशन पर पाबंदियां लागू हो सकती हैं. - इसके अलावा, आपको काम से जुड़ी पाबंदियां, काम को जल्दी पूरा करना, फिर से कोशिश करने की नीति वगैरह जैसी WorkManager की सुविधाओं का फ़ायदा भी मिल सकता है.
- अगर किसी टास्क को पूरा करने के लिए, कनेक्टिविटी को ज़्यादा से ज़्यादा समय तक चालू रखना ज़रूरी है, जैसे कि डेटा सिंक करना या पेरिफ़रल डिवाइसों से पोलिंग करना, तो आपको लंबे समय तक चलने वाले वर्कर्स के लिए सहायता में दिए गए निर्देशों का पालन करके, फ़ोरग्राउंड सेवा शुरू करनी होगी. हालांकि, फ़ोरग्राउंड सेवा के लॉन्च से जुड़ी पाबंदियां, Android 12 से लागू होंगी.
- कोई कार्रवाई करने के लिए,
connectedDevice
टाइप वाली फ़ोरग्राउंड सेवा शुरू करें.- अगर किसी टास्क को पूरा करने के लिए, कनेक्टिविटी को ज़्यादा से ज़्यादा समय तक चालू रखना ज़रूरी है, जैसे कि डेटा सिंक करना या पेरिफ़रल डिवाइसों से पोलिंग करना, तो आपको लंबे समय तक चलने वाले वर्कर्स के लिए सहायता में दिए गए निर्देशों का पालन करके, फ़ोरग्राउंड सेवा शुरू करनी होगी. हालांकि, फ़ोरग्राउंड सेवा के लॉन्च से जुड़ी पाबंदियां, Android 12 से लागू होंगी.
- डिवाइस मौजूद होने पर, अपनी प्रोसेस को चालू करने के लिए,
startScan()
कोPendingIntent
ऑब्जेक्ट के साथ कॉल करें. इसके बारे में डिवाइस ढूंढें में बताया गया है. पेरिफ़रल डिवाइस पर विज्ञापन दिखाया जा रहा हो.- हमारा सुझाव है कि आप एक वर्कर और एक जॉब बनाएं. सिस्टम की वजह से, इस प्रोसेस में रुकावट आ सकती है. इसलिए, यह सिर्फ़ कुछ समय के लिए ही काम करती है.
- Android 12 से पहले के वर्शन में,
PendingIntent
ऑब्जेक्ट से सीधे तौर पर फ़ोरग्राउंड सेवा शुरू की जा सकती है.
- बैकग्राउंड में सेवा शुरू करने के लिए,
CompanionDeviceService
औरREQUEST_COMPANION_RUN_IN_BACKGROUND
याREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
की अनुमतियों में से किसी एक का इस्तेमाल करें.
किसी डिवाइस से कनेक्ट रहें
आम तौर पर, ऐप्लिकेशन को सहायक डिवाइसों से सिर्फ़ तब तक कनेक्ट रहना चाहिए, जब तक ज़रूरी हो. साथ ही, टास्क पूरा होने के बाद उन्हें डिसकनेक्ट कर देना चाहिए. हालांकि, ऐसे दो मामले हो सकते हैं जिनमें किसी ऐप्लिकेशन को हमेशा के लिए कनेक्ट रहने की ज़रूरत पड़ सकती है:
दोनों मामलों में, ये विकल्प उपलब्ध हैं:
REQUEST_COMPANION_RUN_IN_BACKGROUND
अनुमति औरCompanionDeviceManager.startObservingDevicePresence()
तरीके के साथ,CompanionDeviceService
का इस्तेमाल करें.- ऐप्लिकेशन के फ़ोरग्राउंड में होने पर (या छूट वाली किसी स्थिति में)
connectedDevice
फ़ोरग्राउंड टाइप वाली फ़ोरग्राउंड सेवा शुरू करें.
एक से दूसरे ऐप्लिकेशन पर स्विच करते समय
किसी डिवाइस को ढूंढने, उससे कनेक्ट करने, और डेटा ट्रांसफ़र करने में समय लगता है और ज़्यादा संसाधनों की ज़रूरत होती है. जब भी उपयोगकर्ता एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन पर स्विच करता है या एक साथ कई टास्क करता है, तो कनेक्शन टूटने और पूरी प्रोसेस फिर से शुरू होने से बचने के लिए, आपको ऑपरेशन पूरा होने तक कनेक्शन को चालू रखना चाहिए. connectedDevice
टाइप वाली फ़ोरग्राउंड सेवा या साथ काम करने वाले डिवाइस की मौजूदगी के बारे में जानकारी देने वाले एपीआई का इस्तेमाल किया जा सकता है.
सहायक डिवाइसों से जुड़ी सूचनाएं सुनते समय
ऐप्लिकेशन को, डिवाइस के साथ जुड़े डिवाइसों से मिलने वाली सूचनाएं सुनने के लिए, setCharacteristicNotification()
को कॉल करना होगा. साथ ही, onCharacteristicChanged()
का इस्तेमाल करके कॉलबैक सुनने होंगे और कनेक्शन को चालू रखना होगा. ज़्यादातर ऐप्लिकेशन के लिए, CompanionDeviceService
के साथ इस इस्तेमाल के उदाहरण का इस्तेमाल करना सबसे अच्छा होता है. ऐसा इसलिए, क्योंकि ऐप्लिकेशन को लंबे समय तक सुनने की ज़रूरत पड़ सकती है. हालांकि, फ़ोरग्राउंड सेवा का इस्तेमाल भी किया जा सकता है.
दोनों ही मामलों में, किसी डिवाइस से कनेक्ट करें सेक्शन में दिए गए निर्देशों का पालन करके, बंद की गई प्रोसेस को फिर से शुरू किया जा सकता है.