تكرار السؤال: …
الإجابة المختصرة
ثلاثة أنواع: Foreground Service التي تعرض إشعارًا مستمرًا للمستخدم لمهام ملحوظة، و Background Service للمهام غير المرئية، و Bound Service التي ترتبط بمكون عبر واجهة اتصال.
الشرح
لا تعمل الـ Service على خيط مستقل تلقائيًا بل تنفذ كودها على الـ Main Thread افتراضيًا ما لم تنشئ كوروتين أو خيط عمل. فرض نظام أندرويد قيودًا صارمة على Background Services لمنعها من العمل عندما يكون التطبيق مغلقًا، وألزم استخدام Foreground Services مع إشعار مرئي دائم (مثل تشغيل الموسيقى أو تتبع الرحلات).
مثال بالكود
class LocationService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// تحويلها لـ Foreground Service مع إشعار دائم
val notification = buildTrackingNotification()
startForeground(NOTIFICATION_ID, notification)
return START_STICKY
}
override fun onBind(intent: Intent?): IBinder? = null
}أخطاء شائعة
- الاعتقاد بأن الـ Service تنشئ خيطًا منفصلاً تلقائيًا وتنفيذ عمليات حسابية ثقيلة فيها على الـ Main Thread مما يسبب ANR.
- إطلاق Background Service عندما يكون التطبيق في الخلفية في إصدارات أندرويد الحديثة، مما يسبب IllegalStateException فوري.