يقدّم هذا الدليل نظرة عامة على كيفية إتاحة حالات الاستخدام الرئيسية للتواصل مع الأجهزة الملحقة عندما يكون تطبيقك قيد التشغيل في الخلفية:
تتوفّر خيارات متعدّدة لتلبية كل حالة من حالات الاستخدام هذه. لكل منها مزايا وعيوب قد تجعلها أكثر أو أقل ملاءمة لاحتياجاتك المحددة.
يعرض المخطّط البياني التالي نظرة عامة مبسّطة على الإرشادات الواردة في هذه الصفحة:

العثور على جهاز
أولاً، يحتاج تطبيقك إلى العثور على جهاز للاتصال به. للعثور على جهاز BLE، يمكنك استخدام إحدى واجهات برمجة التطبيقات التالية:
BluetoothLeScannerكما هو موضّح في العثور على أجهزة BLE (عيّنة)CompanionDeviceManagerكما هو موضّح في إقران الجهاز المصاحب. (عيّنة)
في الخلفية
ما مِن قيود على استخدام أي من واجهتَي برمجة التطبيقات هاتين عندما لا يكون التطبيق مرئيًا، ولكن يجب أن تكون عملية التطبيق نشطة. إذا لم تكن عملية التطبيق قيد التشغيل، يمكنك استخدام الحلول البديلة التالية:
- بالنسبة إلى
BluetoothLeScanner: يمكنك استدعاءstartScan()باستخدام عنصرPendingIntentبدلاً من عنصرScanCallbackلتلقّي إشعار عند فحص جهاز يتطابق مع الفلتر. (عيّنة) - بالنسبة إلى
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، مثل قيود العمل ومهمة مُعجَّلة وسياسة إعادة المحاولة والمزيد.
- إذا كان يجب إبقاء الاتصال نشطًا لأطول فترة ممكنة لتنفيذ مهمة، مثل مزامنة البيانات أو الاستقصاء من الأجهزة الملحقة، عليك بدء خدمة تعمل في المقدّمة باتّباع الإرشادات الواردة في دعم العاملين الذين يعملون لفترات طويلة. ومع ذلك، تنطبق قيود تشغيل الخدمات التي تعمل في المقدّمة بدءًا من الإصدار 12 من نظام التشغيل Android.
- يمكنك ضبط
- بدء خدمة تعمل في المقدّمة من النوع
connectedDevice- إذا كان يجب إبقاء الاتصال نشطًا لأطول فترة ممكنة لتنفيذ مهمة، مثل مزامنة البيانات أو الاستقصاء من الأجهزة الملحقة، عليك بدء خدمة تعمل في المقدّمة باتّباع الإرشادات الواردة في دعم العاملين الذين يعملون لفترات طويلة. ومع ذلك، تنطبق قيود تشغيل الخدمات التي تعمل في المقدّمة بدءًا من الإصدار 12 من نظام التشغيل Android.
- يمكنك استدعاء
startScan()باستخدام عنصرPendingIntentكما هو موضّح في العثور على جهاز لتنشيط العملية عندما يكون الجهاز متاحًا. يجب أن يكون الجهاز الملحق في وضع الإعلان.- ننصحك ببدء عامل ومهمة. قد يقاطع النظام هذه العملية، وبالتالي يمكنها فقط دعم الاتصال لفترة قصيرة.
- في الإصدارات الأقدم من Android 12، يمكنك بدء خدمة تعمل في المقدّمة
مباشرةً من عنصر
PendingIntent.
- استخدِم
CompanionDeviceServiceوأي من الإذنَينREQUEST_COMPANION_RUN_IN_BACKGROUNDأوREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDلبدء الخدمة من الخلفية.
البقاء على اتصال بجهاز
من الأفضل أن تحافظ التطبيقات على اتصالاتها بالأجهزة الملحقة فقط طالما كان ذلك ضروريًا، وأن تفصلها بمجرد اكتمال المهمة. ومع ذلك، هناك حالتان قد يحتاج فيهما التطبيق إلى إبقاء الاتصال نشطًا إلى أجل غير مسمى:
في كلتا الحالتَين، تتوفّر الخيارات التالية:
- استخدِم
CompanionDeviceServiceمع الإذنREQUEST_COMPANION_RUN_IN_BACKGROUNDوالطريقةCompanionDeviceManager.startObservingDevicePresence(). - بدء خدمة تعمل في المقدّمة عندما يكون التطبيق في المقدّمة (أو ضمن إحدى حالات الإعفاء) باستخدام نوع الخدمة التي تعمل في المقدّمة
connectedDevice
أثناء التبديل بين التطبيقات
يستغرق العثور على جهاز والاتصال به ونقل البيانات وقتًا طويلاً ويستهلك الكثير من الموارد. لتجنُّب فقدان الاتصال والاضطرار إلى تنفيذ العملية بالكامل في كل مرة يبدّل فيها المستخدم بين التطبيقات أو ينفّذ مهامًا متزامنة، يجب إبقاء الاتصال نشطًا حتى تنتهي العملية. يمكنك استخدام خدمة تعمل في المقدّمة من النوع connectedDevice أو واجهة برمجة تطبيقات حضور الجهاز المصاحب.
أثناء الاستماع إلى إشعارات الأجهزة الملحقة
للاستماع إلى إشعارات الأجهزة الملحقة، يجب أن يستدعي التطبيق
setCharacteristicNotification()،
والاستماع إلى عمليات الاستدعاء باستخدام
onCharacteristicChanged()،
والحفاظ على الاتصال نشطًا. بالنسبة إلى معظم التطبيقات، من الأفضل إتاحة حالة الاستخدام هذه
باستخدام CompanionDeviceService لأنّ التطبيق سيحتاج على الأرجح إلى مواصلة الاستماع
لفترات طويلة. ومع ذلك، يمكنك أيضًا استخدام خدمة تعمل في المقدّمة.
في كلتا الحالتين، يمكنك إعادة الاتصال بعد إنهاء العملية باتّباع التعليمات الواردة في قسم الاتصال بجهاز.