انشاء الـ Started Service
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
في الدرس السابق تعرفنا على الـ 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.
رابط الكلاسات المستخدمه في هذا الدرس
- تم استخدام MyStartedService.java في Main6Activity.java.
للحصول على رابط المشروع راجع درس المقدمة.
المصادر والمراجع
- Services overview | Android Developers.
- Service | Android Developers.
- راجع الدرس: تعرف على الـ Services.
للمزيد راجع درس المقدمة.
نهاية الدرس
لاتنسى تتبع الدرس والدورة كذلك لإشعارك عندما يتم التعديل على المتحوى او اضافة المزيد من المعلومات. ايضاً لاتنسى الاعجاب بالدرس ومشاركته مع الاخرين.
محتوى الدورة
الكلمات الدليلية
عن الدرس
0 إعجاب |
1 متابع |
0 مشاركة |
1871 مشاهدات |
منذ 5 سنوات |
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !