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

توفّر الفئة 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.