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

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

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

  • نمی تواند به طور مستقیم با رابط کاربری شما تعامل داشته باشد. برای قرار دادن نتایج آن در UI، باید آنها را به یک 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 در Send work requests to the background service توضیح داده شده است.