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

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

تحديد خدمة intent في البيان

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