יצירת שירות ברקע

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

ל-IntentService יש כמה מגבלות:

  • אין לה אפשרות לקיים אינטראקציה ישירות עם ממשק המשתמש. כדי להציג את התוצאות בממשק המשתמש, צריך לשלוח אותן ל-Activity.
  • בקשות העבודה פועלות לפי סדר. אם הפעולה רצה ב-IntentService ושולחים לה בקשה נוספת, הבקשה ממתינה עד שהפעולה הראשונה תסתיים.
  • אי אפשר להפסיק פעולה שפועלת על IntentService.

עם זאת, ברוב המקרים 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 מתואר במאמר שליחת בקשות עבודה לשירות הרקע.