إنشاء خدمة تعمل في الخلفية

توفّر الفئة IntentService بنية واضحة لتنفيذ عملية على سلسلة محادثات واحدة في الخلفية. ويتيح ذلك للتطبيق معالجة العمليات التي تستغرق وقتًا طويلاً بدون التأثير في استجابة واجهة المستخدم. بالإضافة إلى ذلك، لا تتأثّر IntentService بمعظم الأحداث التي تتعلّق بمراحل نشاط واجهة المستخدم، لذلك تستمر في العمل في ظروف تؤدي إلى إيقاف AsyncTask.

هناك بعض القيود على IntentService:

  • لا يمكنه التفاعل مباشرةً مع واجهة المستخدم. لعرض نتائج البحث في واجهة المستخدم، يجب إرسالها إلى Activity.
  • يتم تنفيذ طلبات العمل بشكل تسلسلي. إذا كانت عملية جارية في IntentService، وأرسلت طلبًا آخر إليها، ينتظر الطلب حتى انتهاء العملية الأولى.
  • لا يمكن إيقاف عملية جارية على IntentService.

مع ذلك، تكون 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 في مقالة إرسال طلبات العمل إلى الخدمة التي تعمل في الخلفية.