במדריך הזה נספק סקירה כללית על תמיכה בתרחישי שימוש מרכזיים לתקשורת עם ציוד היקפי כשהאפליקציה פועלת ברקע:
יש כמה אפשרויות לתמיכה בכל אחד מהתרחישים לדוגמה האלה. לכל אחת מהן יש יתרונות וחסרונות שעשויים להפוך אותה ליותר או פחות מתאימה לצרכים הספציפיים שלכם.
בתרשים הבא מוצגת תצוגה פשוטה של ההנחיות שבדף הזה:

איתור מכשיר
קודם כל, האפליקציה צריכה למצוא מכשיר להתחברות אליו. כדי למצוא מכשיר BLE, אפשר להשתמש באחת מה-API הבאות:
BluetoothLeScannerכפי שמתואר בקטע חיפוש מכשירי BLE. (דוגמה)CompanionDeviceManagerכפי שמתואר בקטע התאמת מכשיר נלווה. (דוגמה)
ברקע
אין הגבלה על השימוש בשני ממשקי ה-API האלה כשהאפליקציה לא גלויה, אבל תהליך האפליקציה צריך לפעול בשני המקרים. אם תהליך האפליקציה לא פועל, תוכלו להשתמש בפתרונות הזמניים הבאים:
- עבור
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, כמו אילוצים על משימות, ביצוע מהיר יותר של משימות, מדיניות ניסיונות חוזרים ועוד.
- אם צריך לשמור על החיבור פעיל כמה שיותר זמן כדי לבצע משימה, כמו סנכרון נתונים או סקירה (polling) מהמכשירים ההיקפיים, צריך להפעיל שירות בחזית בהתאם להנחיות במאמר תמיכה בעובדים לטווח ארוך. עם זאת, ההגבלות על הפעלת שירותים שפועלים בחזית חלות החל מ-Android 12.
- אפשר להגדיר
- הפעלת שירות שפועל בחזית מסוג
connectedDevice.- אם צריך לשמור על החיבור פעיל כמה שיותר זמן כדי לבצע משימה, כמו סנכרון נתונים או סקירה (polling) מהמכשירים ההיקפיים, צריך להפעיל שירות בחזית בהתאם להנחיות במאמר תמיכה בעובדים לטווח ארוך. עם זאת, ההגבלות על הפעלת שירותים שפועלים בחזית חלות החל מ-Android 12.
- כדי להעיר את התהליך כשהמכשיר נמצא בסביבה, צריך להפעיל את
startScan()עם אובייקטPendingIntentכפי שמתואר בקטע חיפוש מכשיר. מכשיר ההיקפי חייב להפעיל פרסום.- מומלץ להתחיל Worker ו-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, כי סביר להניח שהאפליקציה תצטרך להמשיך להקשיב במשך תקופות זמן ארוכות. עם זאת, אפשר גם להשתמש בשירות שפועל בחזית.
בכל מקרה, אפשר להתחבר מחדש אחרי שהתהליך הסתיים, לפי ההוראות בקטע חיבור למכשיר.