انشاء الـ Started Service

Mohammad Laifمنذ 3 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

 

في الدرس السابق تعرفنا على الـ Service وعلى انواعها. في هذا الدرس سنتعرف على طريقة انشاء النوع المسمى بالـ Started Service.

 

نقاط يجب عليك مراعاتها عند العمل مع هذا النوع من الخدمات

  • تعمل في الخيط الرئيسي (Main/UI Thread) لذلك يجب عليك مراعاة عدم استخدامها للمهام الثقيلة.
  • تستخدم للمهام الخفيفة والقصيرة.
  • نرسل لها البيانات باستخدام الـ Intent عند تشغيلها, ولكن لاتستطيع ارجاع اي بيانات (نحتاج لإستخدام اما ResultReceiver او Local Broadcast).
  • نستطيع تشغيلها من خلال المكونات التالية: Activities و Broadcast و Content Provider و Service.
  • عند انهاء المكون الذي قام بتشغيلها فانها تبقى نشطة.
  • يجب عليك اطفائها يدوياً.

 

الهدف
انشاء كلاس Service تقوم بأخد معطيان رقمان ثم تقوم بجمعهم وطباعة الناتج في الـ Log.

 

 طريقة انشاء كلاس من نوع الـ Started Service

  • انشاء كلاس جديدة.
  • عمل Extends لكلاس الـ Service.
  • اضافتها الى ملف الـ Manifest.xml.
  • نعمل Override للدوال:
    • onCreate() يتم نداء هذه الدالة فقط مرة واحدة عند انشاء الـ Service.
    • onStartCommand() يتم نداء هذه الدالة في كل مره نقوم بتشغيل الـ Service.
    • onBind() يجب كتابة هذة الدالة وارجاع قيمة Null من خلالها, والا اصبحت من نوع Bound Service.
    • onDestroy() يتم نداء هذة الدالة عندما نريد انهاء الـ Service.

 

الخطوات

انشاء كلاس جديدة وجعلها تعمل extends لكلاس الـ Service:

public class MyStartedService extends Service {}

 

اضافتها الى ملف الـ Manifest.xml:

<service android:name=".service.MyStartedService"/>

 

نعمل Override للدوال:

public class MyStartedService extends Service {

    private static final String TAG = "MyStartedService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: Called.");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: Called.");

        int firstNumber = intent.getIntExtra(Constant.FIRST_NUMBER, -1);
        int secondNumber = intent.getIntExtra(Constant.SECOND_NUMBER, -2);

        int resultNumber = firstNumber + secondNumber;
        Log.d(TAG, "onStartCommand: Result -> " + resultNumber);

        // Return Tags
        // If Android destroy our service, it gonna restart. Intent won't lost with this tag.
        return Service.START_REDELIVER_INTENT;

        // Restart the service, but Intent lost.
        //return Service.START_STICKY;

        // No Restart, Intent lost.
        //return START_NOT_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: Called.");
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: Called.");
    }
}

لاحظ الداله onStartCommand حيث نقوم هنا بكتابة الشفرة البرمجيه المراد تشغيلها. لاحظ ايضاً نوع الـ return لها وهو START_REDELIVER_INTENT يستخدم للطلب من نظام الاندرويد باعادة تشغيلها (في حالة قام النظام او خطئ باطفائها) واعادة محتويات الـ intent التي تم تشغيلها بواسطها.

 

طريقة تشغيل وانهاء الـ Started Service
لتشغيلها:

من اي مكون مثلاً من الـ Activity:

Intent intent = new Intent(Main6Activity.this, MyStartedService.class);
intent.putExtra(Constant.FIRST_NUMBER, 10);
intent.putExtra(Constant.SECOND_NUMBER, 20);
startService(intent);

لاحظ طريقة ارسال لها البيانات اثناء تشغيلها من خلال الـ Intent.

 

لإنهائها:

Intent intent = new Intent(Main6Activity.this, MyStartedService.class);
stopService(intent); // Or we can use stopSelf() inside the service class ot stop it, after our work has done.

 

حل تشغيل مهمه طويله على الستارتت سيرفس

قم بإنشاء احد انماط التصميم للخيوط الحاسوبية كما هو مشروح بالدروس السابقه وهذا مثال سريع لإستخدام الـ AsyncTask:

في دالة الـ onStartCommand نضع الكود الذي سوف يشغل الـ AsyncTAsk:

// Background Thread (If you want to make long task, or use IntentService)
AsyncTask task = new BackgroundAsyncTask().execute();

 

وهذه هي كلاس الـ AsyncTask كـ Inner Class:

    private class BackgroundAsyncTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            // Do our long work on the background and different thread.
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            // We can stop our service here like:
            // stopSelf();
        }

    }

لاحظ استخدام الـ stopSelf() حتى نقوم بإطفاء هذه الـ Service في حال الانتهاء من العمل.

 

في هذا الدرس رأينا طريقة انشاء واستخدام الخدمة Started Service. في الدرس القادم سنرى طريقة استخدام الـ Intent Service.

 

رابط الكلاسات المستخدمه في هذا الدرس

للحصول على رابط المشروع راجع درس المقدمة.
 

المصادر والمراجع

للمزيد راجع درس المقدمة.
 

نهاية الدرس
لاتنسى تتبع الدرس والدورة كذلك لإشعارك عندما يتم التعديل على المتحوى او اضافة المزيد من المعلومات. ايضاً لاتنسى الاعجاب بالدرس ومشاركته مع الاخرين.

المحاضر

Mohammad Laif

محتوى الدورة

تمهيد
1 مقدمة
2 تعرف على التزامن (الـ Concurrency)
3 اخطاء التزامن (الـ Concurrency) الشائعة
العمليات Processes
1 الهيكلة الهندسية لبيئة نظام الاندرويد
2 طبقة الـ Android Runtime و العمليات Processes
3 انواع العمليات (Processes)
الخيوط الحاسوبية Threads
1 الخيوط الحاسوبية (Threads)
2 مكونات الخيوط الحاسوبية (Thread)
3 انشاء الخيط الحاسوبي
أنماط التصميم للخيوط الحاسوبية
1 انشاء نمط الـ Handler و Looper و Thread
2 انشاء نمط الـ HandlerThreads
3 ماهو نمط الـ Thread Pools (الـ Executors)
4 استخدام نمط الـ Thread Pools كـ Singleton
5 استخدام الـ Callable مع نمط الـ Thread Pools
6 انشاء بركة خيوط حاسوبية Thread Pools لتسريع قاعدة البيانات
7 انشاء نمط الـ AsyncTask
8 انشاء نمط الـ Loader
الـ Broadcasts
1 تعرف على الـ Broadcast Receiver
2 انشاء الـ Broadcast Receiver بشكل ثابت
3 انشاء الـ Broadcast Receiver بشكل ديناميكي
4 استخدام الـ Local Broadcast للتخاطب بين المكونات
الـ Services
1 تعرف على الـ Services
2 انشاء الـ Started Service الدرس الحالي
3 انشاء الـ Intent Service
4 انشاء الـ Bound Service
5 استخدام الـ ResultReceiver للتخاطب مع الـ Intent Service
6 استخدام الـ Broadcast للتخاطب مع الـ Started Service
الـ Alarm Manager
1 تعرف على الـ Alarm Manager
2 طرق استخدام الـ Alarm Manager
الـ Jobs
1 استخدام الـ Android JobSchedualer
2 استخدام الـ Firebase JobDispatcher
3 استخدام الـ WorkManager من حزمة JetPack

الكلمات الدليلية

عن الدرس

0 إعجاب
1 متابع
0 مشاركة
1199 مشاهدات
منذ 3 سنوات

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !