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