توفّر الفئة IntentService
بنية واضحة لتشغيل
عملية على سلسلة محادثات واحدة في الخلفية. ويسمح ذلك بالتعامل مع العمليات طويلة المدى بدون التأثير في استجابة واجهة المستخدم. بالإضافة إلى ذلك، لا يتأثر
IntentService
بمعظم أحداث مراحل نشاط واجهة المستخدم، لذا
يستمر في العمل في الظروف التي قد تؤدي إلى إيقاف AsyncTask
تخضع IntentService
لبعض القيود:
-
ولا يمكنه التفاعل مباشرةً مع واجهة المستخدم لديك. لعرض نتائجه في واجهة المستخدم، يجب إرسالها إلى
Activity
. -
يتم تشغيل طلبات العمل بشكل تسلسلي. إذا كانت العملية قيد التشغيل في
IntentService
وأرسلت إليها طلبًا آخر، سينتظر الطلب حتى انتهاء العملية الأولى. -
لا يمكن مقاطعة عملية يتم تنفيذها على
IntentService
.
ومع ذلك، تكون IntentService
هي الطريقة المفضّلة في معظم الحالات لإجراء
عمليات بسيطة في الخلفية.
يوضِّح لك هذا الدليل كيفية تنفيذ الإجراءات التالية:
- إنشاء فئتك الفرعية من
IntentService
. - أنشئ طريقة معاودة الاتصال المطلوبة
onHandleIntent()
. - حدِّد
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.
تحديد خدمة الغرض في البيان
يحتاج 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
.