کلاس 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 توضیح داده شده است.