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