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

הכיתה 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.

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