الخدمة مكوّن في Android يستطيع تنفيذ العمل دون أن تكون له واجهة مستخدم خاصة به، مثل تشغيل الموسيقى أو مزامنة البيانات أو نقل ملف جارٍ. وتُعدّ الخدمات، مع الأنشطة ومستقبلات البث وموفّري المحتوى، أحد مكونات التطبيق الأساسية الأربعة في Android، ويجب كغيرها تسجيلها في ملف AndroidManifest.xml الخاص بالتطبيق. وافتراضيًا، تعمل الخدمة على الخيط الرئيسي للتطبيق، لذا لا يزال يجب نقل العمل الثقيل إلى خيط خلفي.
ويميز Android بين الخدمات المُبدوءة، التي تنفذ مهمة حتى تُوقف، والخدمات المرتبطة، التي تستطيع المكونات الأخرى الارتباط بها والتواصل معها. وتنفذ خدمة الواجهة عملًا يدركه المستخدم ويجب أن تعرض إشعارًا دائمًا. ولأن العمل في الخلفية يؤثر في عمر البطارية والأداء، أدخل Android تدريجيًا قيودًا على متى يجوز للتطبيقات بدء الخدمات في الخلفية، وللعمل القابل للتأجيل توصي Google عادة بـ WorkManager بدلًا من ذلك.
الخدمة في Android مكوّن تطبيق ينفذ العمل دون واجهة مستخدم خاصة به، مثل تشغيل الموسيقى أو المزامنة أو نقل الملفات. ويمكن بدؤها لتنفيذ مهمة أو ربطها بمكونات أخرى تريد التواصل معها. وتعرض خدمات الواجهة إشعارًا دائمًا حتى يعرف المستخدم أن العمل جارٍ، وبسبب قيود Android على العمل في الخلفية، كثيرًا ما يُستخدم WorkManager للمهام القابلة للتأجيل.
More about Service
الخدمة أحد المكونات الأساسية الأربعة لتطبيق Android، مع الأنشطة ومستقبلات البث وموفّري المحتوى. فبينما يعرض النشاط شاشة يتفاعل معها المستخدم، تُستخدم الخدمة للعمل الذي لا يتطلب واجهة مستخدم أو الذي يجب أن يستمر حتى لو غادر المستخدم الشاشة. ومن الأمثلة المعتادة تشغيل الموسيقى أو البودكاست والملاحة ورفع الملفات ومزامنة البيانات مع خادم.
من الناحية التقنية، الخدمة فئة ترث من android.app.Service وتُسجَّل بعنصر service في AndroidManifest.xml. ويتحكم النظام في دورة حياة الخدمة من خلال دوال مثل onCreate() و onStartCommand() و onBind() و onDestroy(). ومن المهم معرفة أن الخدمة لا تعمل تلقائيًا على خيط منفصل. فافتراضيًا، تُنفَّذ شيفرتها على الخيط الرئيسي للتطبيق، لذا يجب نقل العمل طويل الأمد أو الحاجب إلى خيط خلفي، مثلًا بالروتينات المشتركة في Kotlin، لمنع التطبيق من التوقف عن الاستجابة.
يمكن استخدام الخدمات بطرق مختلفة، تناسب كل منها احتياجات مختلفة:
خدمة الواجهة: تنفذ عملًا يدركه المستخدم، مثل تشغيل الموسيقى أو تتبع التمرين النشط. ويجب أن تعرض خدمة الواجهة إشعارًا دائمًا، وفي إصدارات Android الأحدث يجب أن يُعلن التطبيق نوع الخدمة وأن يحوز الأذونات المرتبطة به.
خدمة الخلفية: تنفذ عملًا لا يراه المستخدم مباشرة. ومنذ Android 8.0، توجد قيود صارمة على متى يجوز للتطبيقات بدء مثل هذه الخدمات وهي نفسها في الخلفية.
الخدمة المرتبطة: توفر واجهة عميل وخادم تستطيع فيها المكونات الأخرى، بما فيها مكونات التطبيقات الأخرى، الارتباط بالخدمة وإرسال الطلبات وتلقي الاستجابات. وتعيش الخدمة المرتبطة ما دام مكوّن واحد على الأقل مرتبطًا بها.
ومن أكبر نقاط قوة الخدمات أنها تتيح للتطبيق مواصلة العمل المهم دون أن يكون مرتبطًا بشاشة معينة. وفي الوقت نفسه، تتطلب الحذر، لأن العمل في الخلفية يستهلك البطارية والذاكرة والبيانات. لذا أدخل Android تدريجيًا قواعد تقيّد العمل في الخلفية، ويستطيع المستخدمون رؤية التطبيقات التي تشغّل خدمات الواجهة وإيقافها.
ولكثير من المهام، توصي Google بدلًا من ذلك بـ WorkManager، وهو جزء من Android Jetpack. وقد صُمم WorkManager للعمل الذي يجب تنفيذه بموثوقية، حتى لو أُغلق التطبيق أو أُعيد تشغيل الجهاز، والذي يمكن تأجيله، مثل رفع ملفات السجل أو المزامنة الدورية. ويراعي WorkManager قيود النظام ويمكن إعداده بشروط مثل الاتصال بالشبكة أو الشحن.
خلاصة القول، الخدمة هي الخيار الصحيح عندما يحتاج التطبيق إلى تنفيذ عمل مستمر يتوقع المستخدم استمراره، أو عندما تحتاج مكونات أخرى إلى التواصل مع عملية طويلة الأمد. وباختيار النوع الصحيح من الخدمات، أو WorkManager عندما يمكن تأجيل العمل، يستطيع المطورون بناء تطبيقات وظيفية ورفيقة بموارد الجهاز معًا.
Frequently asked questions about Service
ما هي الخدمة في Android؟
الخدمة مكوّن في Android ينفذ العمل في الخلفية دون أن تكون له واجهة مستخدم خاصة به. وتُستخدم للمهام التي يلزم أن تستمر حتى عندما لا ينظر المستخدم إلى التطبيق، مثل تشغيل الموسيقى أو الملاحة الجارية أو رفع الملفات.
ويجب الإعلان عن الخدمة في ملف AndroidManifest.xml. ومن المهم معرفة أن الخدمة تعمل افتراضيًا على الخيط الرئيسي للتطبيق. لذا لا يزال يجب نقل المهام الثقيلة إلى خيط خلفي أو روتين مشترك. وفي إصدارات Android الأحدث، توجد أيضًا قواعد صارمة بشأن متى يجوز للتطبيقات العمل في الخلفية، من أجل توفير البطارية.
ما أنواع الخدمات الموجودة في Android؟
يميز Android بين ثلاثة أنواع من الخدمات. فخدمة الواجهة تنفذ مهمة يدركها المستخدم، ويجب أن تعرض إشعارًا طوال مدة عملها. وتُستخدم مثلًا لتشغيل الموسيقى أو تتبع الجري.
وتنفذ خدمة الخلفية عملًا لا يراه المستخدم مباشرة. ومنذ Android 8.0، توجد قيود صارمة على متى يجوز للتطبيقات بدء مثل هذه الخدمات، ويُوصى بـ WorkManager بدلًا من ذلك لكثير من المهام. أما الخدمة المرتبطة فتتيح لمكونات أخرى، مثل النشاط، الارتباط بها والتواصل معها، ولا تعمل إلا ما دام شيء ما مرتبطًا بها.
ما الفرق بين الخدمة المُبدوءة والخدمة المرتبطة؟
تُبدأ الخدمة المُبدوءة بـ startService أو startForegroundService وتعمل حتى توقف نفسها أو تُوقف. وهي تنفذ عادة مهمة محددة ولا تعيد نتيجة مباشرة إلى المكوّن الذي بدأها.
أما الخدمة المرتبطة فتُبدأ عندما يرتبط بها مكوّن آخر بـ bindService. وهي توفر واجهة حتى يستطيع المكوّن استدعاء الدوال وتلقي الاستجابات، مثل نشاط يتحكم في مشغل موسيقى. وعندما لا تعود هناك مكونات مرتبطة بها، تُوقف. ويمكن للخدمة أيضًا أن تكون الاثنين معًا إذا كانت مُبدوءة ومرتبطة في آن واحد.
متى ينبغي استخدام WorkManager بدلًا من الخدمة؟
WorkManager هو الحل الذي توصي به Google للعمل الخلفي الذي يجب تنفيذه بموثوقية، حتى لو أُغلق التطبيق أو أُعيد تشغيل الجهاز. وقد يكون ذلك مزامنة البيانات أو رفع ملفات السجل أو التنظيف الدوري.
ويحترم WorkManager قواعد النظام بشأن البطارية والنشاط في الخلفية، ويمكن ضبطه ليعمل فقط عندما يكون الجهاز مثلًا متصلًا بشبكة Wi-Fi أو قيد الشحن. أما الخدمة، ولا سيما خدمة الواجهة، فتكون أنسب عندما يلزم أن يحدث العمل فورًا ويكون مرئيًا للمستخدم، مثل تشغيل الموسيقى أو مكالمة جارية. وللعمل قصير الأمد أثناء فتح التطبيق، كثيرًا ما تكفي الروتينات المشتركة.
لماذا يجب أن تعرض خدمة الواجهة إشعارًا؟
يمكن أن تعمل خدمة الواجهة مدة طويلة وتستهلك موارد مثل المعالج والبطارية وبيانات الموقع بينما لا يكون التطبيق مفتوحًا لدى المستخدم. لذا يشترط Android أن تعرض إشعارًا دائمًا، حتى يعرف المستخدم أن التطبيق يعمل في الخلفية.
وهذا يوفر الشفافية ويتيح للمستخدم إيقاف الخدمة أو فتح التطبيق. وفي إصدارات Android الأحدث، يجب على المطورين أيضًا إعلان نوع للخدمة، مثل تشغيل الوسائط أو الموقع أو مزامنة البيانات، وحيازة الأذونات المرتبطة به. وابتداءً من Android 13، يجب على المستخدم أيضًا منح الإذن بالإشعارات، ما يؤثر في كيفية عرض الإشعار.
ما القيود التي يفرضها Android على العمل في الخلفية؟
لتوفير البطارية وحماية خصوصية المستخدم، أدخل Android تدريجيًا قيودًا على العمل في الخلفية. فمنذ Android 8.0، لا يجوز عمومًا للتطبيقات العاملة في الخلفية بدء خدمات الخلفية العادية، ويوقفها النظام بعد وقت قصير.
ويؤجل وضع Doze و App Standby الوصول إلى الشبكة والمهام عندما لا يكون الجهاز قيد الاستخدام أو عندما يندر استخدام التطبيق. وتشترط الإصدارات الأحدث أنواعًا وأذونات لخدمات الواجهة وتقيّد متى يجوز بدؤها من الخلفية. ويتطلب الوصول إلى الموقع في الخلفية إذنًا منفصلًا. لذا ينبغي جدولة العمل في الخلفية بـ WorkManager كلما أمكن.
Service for dummies
الخدمة في تطبيق Android نوع من المساعدين غير المرئيين الذي يستطيع مواصلة العمل حتى عندما لا ينظر أحد إلى التطبيق. فكّروا في تطبيق موسيقى: يمكن تشغيل أغنية، ويستطيع المستخدم العودة إلى الشاشة الرئيسية وكتابة رسالة، وتستمر الموسيقى في العمل. الخدمة هي التي تتولى ذلك. وعندما يستخدم تطبيق خدمة لشيء ينبغي أن يعرفه المستخدم، يعرض الهاتف إشعارًا صغيرًا، فيتضح أن التطبيق يعمل. وفي الوقت نفسه، يحرص Android على ألا تستهلك التطبيقات طاقة كثيرة في الخلفية، حتى تدوم البطارية مدة أطول.