ایجاد سرویس پس‌زمینه‌ای

کلاس IntentService ساختاری ساده برای اجرای عملیات در یک رشته پس‌زمینه تکی ارائه می‌دهد. این کار به آن اجازه می‌دهد عملیات طولانی‌مدت را بدون تأثیر بر پاسخ‌گویی میانای کاربر شما انجام دهد. همچنین، IntentService تحت‌تأثیر اکثر رویدادهای چرخه حیات میانای کاربر قرار نمی‌گیرد، بنابراین در شرایطی که AsyncTask خاموش می‌شود، به اجرا ادامه می‌دهد

IntentService چند محدودیت دارد:

  • نمی‌تواند مستقیماً با میانای کاربر شما تعامل داشته باشد. برای قرار دادن نتایج آن در میانای کاربر، باید آن‌ها را به Activity ارسال کنید.
  • درخواست‌های کاری به‌صورت متوالی اجرا می‌شوند. اگر عملیاتی در IntentService درحال اجرا باشد و درخواست دیگری برای آن ارسال کنید، درخواست تا زمانی که عملیات اول تمام شود منتظر می‌ماند.
  • عملیاتی که در IntentService اجرا می‌شود نمی‌تواند قطع شود.

بااین‌حال، در اکثر موارد IntentService روش ترجیحی برای انجام عملیات ساده پس‌زمینه است.

این راهنما به شما نشان می‌دهد که چگونه کارهای زیر را انجام دهید:

  • زیرکلاس خودتان را از IntentService ایجاد کنید.
  • روش بازخوانی لازم onHandleIntent() را ایجاد کنید.
  • IntentService را در فایل مانیفست خود تعریف کنید.

مدیریت کردن هدف‌های ورودی

برای ایجاد مؤلفه IntentService برای برنامه‌تان، کلاسی را تعریف کنید که IntentService را گسترش دهد و در آن، روشی را تعریف کنید که onHandleIntent() را لغو کند. برای مثال:

کاتلین

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
        ...
    }
}

جاوا

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 در ارسال درخواست‌های کار به سرویس پس‌زمینه‌ای شرح داده شده است.