يقدّم هذا الدليل نظرة عامة على كيفية توفير حالات الاستخدام الرئيسية ل التواصل مع الأجهزة الطرفية عندما يكون تطبيقك قيد التشغيل في الخلفية:
تتوفّر خيارات متعدّدة لتلبية كلّ حالة من حالات الاستخدام هذه. ولكل موقع من هذه المواقع مزايا وعيوب قد تجعله أكثر أو أقل ملاءمةً لاحتياجاتك المحددة.
يعرض الرسم البياني التالي عرضًا مبسطًا للإرشادات الواردة في هذه الصفحة:
العثور على جهاز
أولاً، يجب أن يعثر تطبيقك على جهاز للاتصال به. للعثور على جهاز BLE، يمكنك استخدام أيّ من واجهات برمجة التطبيقات التالية:
BluetoothLeScanner
كما هو описан في العثور على الأجهزة التي تتضمّن تقنية BLE. (نموذج)CompanionDeviceManager
كما هو موضّح في مقالة إقران الجهاز المصاحب. (نموذج)
في الخلفية
لا يوجد أي قيود على استخدام أي من واجهات برمجة التطبيقات هذه عندما يكون التطبيق غير مرئي، ولكن يجب أن تكون عملية تطبيقك نشطة لاستخدامهما. إذا لم تكن عملية التطبيق قيد التشغيل، يمكنك استخدام الحلول البديلة التالية:
- بالنسبة إلى
BluetoothLeScanner
: يمكنك الاتصال بتطبيقstartScan()
باستخدام عنصرPendingIntent
بدلاً من عنصرScanCallback
لتلقّي إشعار عند فحص جهاز يتطابق مع الفلتر. (نموذج) - بالنسبة إلى
CompanionDeviceManager
: اتّبِع الإرشادات الواردة في مقالة إبقاء التطبيقات المصاحبة مستيقظة ل despierto التطبيق وإبقائه مستيقظًا عندما يكون جهاز مرتبط سابقًا في النطاق. (نموذج)
الاتصال بجهاز
للاتصال بجهاز بعد العثور عليه، عليك الحصول على مثيل
BluetoothDevice
للجهاز من أحد المصادر التالية:
- نتيجة فحص
BluetoothLeScanner
كما هو موضّح في القسم السابق - تم استرداد قائمة الأجهزة المرتبطة من
BluetoothAdapter.getBondedDevices()
. - ذاكرة التخزين المؤقت في
BluetoothAdapter
، باستخدامBluetoothAdapter.getRemoteLeDevice()
بعد إنشاء مثيل BluetoothDevice
، يمكنك بدء طلب اتصال
بالجهاز المقابل من خلال استدعاء إحدى connectGatt()
methods. تحدِّد القيمة التي يتم تمريرها إلى القيمة المنطقية 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
لبدء الخدمة من الخلفية.
البقاء متصلاً بجهاز
من المفترض أن تحافظ التطبيقات على اتصالاتها بالأجهزة الملحقة فقط ما دامت ضرورية، وأن تقطع الاتصال بعد اكتمال المهمة. ومع ذلك، هناك حالتان قد يحتاج فيها التطبيق إلى إبقاء الاتصال قائمًا إلى أجل غير مسمى:
في كلتا الحالتَين، تتوفّر الخيارات التالية:
- استخدِم
CompanionDeviceService
مع الإذنREQUEST_COMPANION_RUN_IN_BACKGROUND
وطريقةCompanionDeviceManager.startObservingDevicePresence()
. - بدء خدمة تعمل في المقدّمة عندما يكون
التطبيق في المقدّمة (أو ضمن أحد
الإعفاءات)
باستخدام نوع الخدمة التي تعمل في
connectedDevice
المقدّمة
أثناء التبديل بين التطبيقات
إنّ العثور على جهاز والاتصال به ونقل البيانات يتطلّب وقتًا وموارد كثيرة. لتجنُّب فقدان الاتصال والحاجة إلى تنفيذ العملية الكاملة في كل مرة يبدّل فيها المستخدم بين التطبيقات أو ينفّذ مهام مماثلة، يجب إبقاء الاتصال قائمًا إلى أن تنتهي العملية. يمكنك
استخدام إما خدمة تعمل في المقدّمة من النوع connectedDevice
أو واجهة برمجة التطبيقات
companion device presence.
أثناء الاستماع إلى إشعارات الأجهزة الملحقة
للاستماع إلى الإشعارات من الأجهزة الطرفية، يجب أن يستدعي التطبيق setCharacteristicNotification()
، ويسمع عمليات الاستدعاء باستخدام onCharacteristicChanged()
، ويحافظ على الاتصال. بالنسبة إلى معظم التطبيقات، من الأفضل توفير حالة الاستخدام هذه
باستخدام CompanionDeviceService
لأنّه من المحتمل أن يحتاج التطبيق إلى مواصلة الاستماع
لفترات طويلة. ومع ذلك، يمكنك أيضًا استخدام خدمة تعمل في المقدّمة.
في كلتا الحالتَين، يمكنك إعادة الاتصال بعد إنهاء عملية باتّباع التعليمات الواردة في القسم الاتصال بجهاز.