این راهنما یک نمای کلی از نحوه پشتیبانی از موارد استفاده کلیدی برای برقراری ارتباط با دستگاههای جانبی هنگامی که برنامه شما در پسزمینه اجرا میشود، ارائه میکند:
چندین گزینه برای پشتیبانی از هر یک از این موارد استفاده وجود دارد. هر کدام مزایا و معایبی دارند که ممکن است کم و بیش برای نیازهای خاص شما مناسب باشد.
نمودار زیر نمای ساده ای از راهنمای این صفحه را نشان می دهد:
یک دستگاه پیدا کنید
ابتدا، برنامه شما باید دستگاهی را برای اتصال پیدا کند. برای پیدا کردن یک دستگاه BLE می توانید از یکی از API های زیر استفاده کنید:
-
BluetoothLeScanner
همانطور که در Find devices BLE توضیح داده شده است. ( نمونه ) -
CompanionDeviceManager
همانطور که در جفت کردن دستگاه همراه توضیح داده شده است. ( نمونه )
در پس زمینه
هیچ محدودیتی برای استفاده از هر یک از این API ها در حالی که برنامه قابل مشاهده نیست وجود ندارد، اما هر دوی آنها برای زنده بودن به فرآیند برنامه شما نیاز دارند. اگر فرآیند برنامه اجرا نمی شود، می توانید از راه حل های زیر استفاده کنید:
- برای
BluetoothLeScanner
: با یک شیPendingIntent
به جای شیءScanCallback
باstartScan()
تماس بگیرید تا وقتی دستگاهی که با فیلتر شما مطابقت دارد اسکن شود مطلع شوید. ( نمونه ) - برای
CompanionDeviceManager
: دستورالعملهای موجود در Keep companion apps awake را دنبال کنید تا برنامه را بیدار کنید و زمانی که دستگاه مرتبط قبلی در محدوده است، برنامه را بیدار نگه دارید. ( نمونه )
به یک دستگاه متصل شوید
برای اتصال به یک دستگاه پس از یافتن آن، باید یک نمونه BluetoothDevice
دستگاه را از یکی از منابع زیر دریافت کنید:
- نتیجه اسکن
BluetoothLeScanner
همانطور که در بخش قبل توضیح داده شد. - لیست دستگاه متصل شده از
BluetoothAdapter.getBondedDevices()
بازیابی شده است. - حافظه پنهان
BluetoothAdapter
، با استفاده ازBluetoothAdapter.getRemoteLeDevice()
.
پس از اینکه یک نمونه BluetoothDevice
داشتید، می توانید با فراخوانی یکی از متدهای connectGatt()
درخواست اتصال به دستگاه مربوطه را شروع کنید. مقداری که به بولین autoConnect
ارسال می کنید، مشخص می کند که کلاینت GATT از کدام یک از دو حالت اتصال زیر استفاده می کند:
- اتصال مستقیم (
autoconnect = false
): سعی کنید مستقیماً به دستگاه جانبی وصل شوید و اگر دستگاه در دسترس نباشد، با شکست مواجه شوید. در صورت قطع ارتباط، کلاینت گات به طور خودکار سعی در اتصال مجدد ندارد. - اتصال خودکار (
autoconnect = true
): سعی کنید هر زمان که دستگاه جانبی در دسترس بود به طور خودکار به آن متصل شوید. در صورت قطع اتصال توسط دستگاه جانبی یا به دلیل خارج شدن دستگاه جانبی از محدوده، مشتری GATT به طور خودکار سعی می کند تا زمانی که دستگاه جانبی در دسترس است، دوباره وصل شود.
در پس زمینه
زمانی که برنامه در پسزمینه است، هیچ محدودیتی برای اتصال به دستگاه وجود ندارد، اگرچه در صورت قطع شدن فرآیند، اتصال بسته میشود. علاوه بر این محدودیتهایی برای شروع فعالیتها (در اندروید 10 و بالاتر) یا خدمات پیشزمینه (در اندروید 12 و بالاتر) از پسزمینه وجود دارد.
بنابراین، برای انجام یک اتصال در پسزمینه، برنامهها میتوانند از راهحلهای زیر استفاده کنند:
- از WorkManager برای اتصال به دستگاه خود استفاده کنید.
- می توانید یک
PeriodicWorkRequest
یا یکOneTimeWorkRequest
برای انجام یک عمل تعریف شده تنظیم کنید، اگرچه ممکن است محدودیت های برنامه اعمال شود . - علاوه بر این، میتوانید از ویژگیهای WorkManager مانند محدودیتهای کاری ، کار سریع ، خطمشی امتحان مجدد و موارد دیگر بهرهمند شوید.
- اگر برای انجام یک کار، مانند همگامسازی داده یا نظرسنجی از دستگاههای جانبی، لازم است اتصال تا زمانی که ممکن است زنده بماند، باید یک سرویس پیشزمینه را با پیروی از راهنمایی در پشتیبانی از کارگران طولانی مدت راهاندازی کنید. با این حال، محدودیت های راه اندازی سرویس پیش زمینه از اندروید 12 اعمال می شود.
- می توانید یک
- یک سرویس پیش زمینه را با نوع
connectedDevice
شروع کنید.- اگر برای انجام یک کار، مانند همگامسازی داده یا نظرسنجی از دستگاههای جانبی، لازم است اتصال تا زمانی که ممکن است زنده بماند، باید یک سرویس پیشزمینه را با پیروی از راهنمایی در پشتیبانی از کارگران طولانی مدت راهاندازی کنید. با این حال، محدودیت های راه اندازی سرویس پیش زمینه از اندروید 12 اعمال می شود.
- همانطور که در Find a device توضیح داده شده است،
startScan()
با یک شیPendingIntent
فراخوانی کنید تا وقتی دستگاه وجود دارد، فرآیند شما را بیدار کند. دستگاه جانبی باید تبلیغاتی باشد.- توصیه می کنیم یک Worker and a Job را راه اندازی کنید. این ممکن است توسط سیستم قطع شود و بنابراین فقط می تواند ارتباطات کوتاه مدت را پشتیبانی کند.
- در نسخههای پایینتر از 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
یا API حضور دستگاه همراه استفاده کنید.
هنگام گوش دادن به اعلان های جانبی
برای گوش دادن به اعلانهای جانبی، برنامه باید setCharacteristicNotification()
را فراخوانی کند، با استفاده از onCharacteristicChanged()
به تماسهای برگشتی گوش دهد و اتصال را زنده نگه دارد. برای اکثر برنامهها، بهتر است از این مورد استفاده با CompanionDeviceService
پشتیبانی کنید، زیرا برنامه احتمالاً باید برای مدت طولانی به گوش دادن ادامه دهد. با این حال، می توانید از خدمات پیش زمینه نیز استفاده کنید.
در هر صورت، میتوانید پس از پایان فرآیند با دنبال کردن دستورالعملهای بخش اتصال به دستگاه، دوباره وصل شوید.