הכיתה IntentService
מציעה מבנה פשוט להרצה
פעולה בשרשור יחיד ברקע. כך ניתן לטפל בפעולות ממושכות
בלי להשפיע על רמת התגובה של ממשק המשתמש. כמו כן,
IntentService
לא מושפע מרוב האירועים במחזור החיים של ממשק המשתמש, לכן
ממשיך לפעול בנסיבות שעלולות להשבית AsyncTask
ל-IntentService
יש כמה מגבלות:
-
אין לה אפשרות לקיים אינטראקציה ישירות עם ממשק המשתמש. כדי להציג את התוצאות בממשק המשתמש,
צריך לשלוח אותם אל
Activity
. -
בקשות עבודה פועלות ברצף. אם פעולה מתבצעת
IntentService
, ושולחים אליה בקשה נוספת, הבקשה ממתינה עד הפעולה הראשונה הסתיימה. -
אי אפשר להפסיק פעולה שפועלת על
IntentService
.
עם זאת, ברוב המקרים IntentService
הוא הדרך המועדפת לבצע
פעולות פשוטות ברקע.
במדריך הזה תלמדו:
- ליצור מחלקה משלך של
IntentService
. - יוצרים את שיטת הקריאה החוזרת הנדרשת
onHandleIntent()
. - הגדרת
IntentService
בקובץ המניפסט.
טיפול בכוונות נכנסות
כדי ליצור רכיב IntentService
לאפליקציה, צריך להגדיר מחלקה
להרחיב את IntentService
, ובתוכו להגדיר שיטה
מבטל את onHandleIntent()
. לדוגמה:
Kotlin
class RSSPullService : IntentService(RSSPullService::class.simpleName) override fun onHandleIntent(workIntent: Intent) { // Gets data from the incoming Intent val dataString = workIntent.dataString ... // Do work here, based on the contents of dataString ... } }
Java
public class RSSPullService extends IntentService { @Override protected void onHandleIntent(Intent workIntent) { // Gets data from the incoming Intent String dataString = workIntent.getDataString(); ... // Do work here, based on the contents of dataString ... } }
שימו לב שהקריאות החוזרות האחרות של רכיב Service
רגיל, כמו
onStartCommand()
מופעלים באופן אוטומטי על ידי
IntentService
. בIntentService
, צריך להימנע
ביטול הקריאות החוזרות האלה.
למידע נוסף על יצירת IntentService
, ראו הרחבת
סיווג IntentService.
הגדרה של שירות Intent במניפסט
צריך גם להזין IntentService
במניפסט של האפליקציה.
יש להזין את הרשומה הזו בתור
<service>
שהוא צאצא של
רכיב
<application>
:
<application android:icon="@drawable/icon" android:label="@string/app_name"> ... <!-- Because android:exported is set to "false", the service is only available to this app. --> <service android:name=".RSSPullService" android:exported="false"/> ... </application>
המאפיין android:name
מציין את שם הסיווג של
IntentService
.
שימו לב
<service>
לא מכיל
מסנן כוונת רכישה.
הפקודה Activity
ששולחת בקשות עבודה לשירות משתמשת ב-
מפורש של Intent
, כך שלא נדרש מסנן. גם
כלומר, רק רכיבים באותה אפליקציה או באפליקציות אחרות עם
אותו מזהה משתמש יכול לגשת לשירות.
עכשיו, כשיש לך את הכיתה הבסיסית ב-IntentService
, אפשר לשלוח בקשות עבודה
אליו עם Intent
אובייקטים. התהליך לבניית האובייקטים האלה
והשליחה שלהם אל IntentService
מתוארת ב-
לשלוח בקשות עבודה לשירות הרקע.