במדריך הזה נספק סקירה כללית על תמיכה בתרחישי שימוש מרכזיים לתקשורת עם ציוד היקפי כשהאפליקציה פועלת ברקע:
יש כמה אפשרויות לתמיכה בכל אחד מהתרחישים לדוגמה האלה. לכל אחת מהן יש יתרונות וחסרונות שעשויים להפוך אותה ליותר או פחות מתאימה לצרכים הספציפיים שלכם.
בתרשים הבא מוצגת תצוגה פשוטה של ההנחיות שבדף הזה:
איתור מכשיר
קודם כל, האפליקציה צריכה למצוא מכשיר להתחברות אליו. כדי למצוא מכשיר 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
, כי סביר להניח שהאפליקציה תצטרך להמשיך להקשיב במשך תקופות זמן ארוכות. עם זאת, אפשר גם להשתמש בשירות שפועל בחזית.
בכל מקרה, אפשר להתחבר מחדש אחרי שהתהליך הסתיים, לפי ההוראות בקטע חיבור למכשיר.