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