همه چیز راجع به سرویس ها در اندروید(۱)

(مقدمات سرویس ، سرویس چیست؟ ، تفاوت ها)

سطح : پیشرفته

اساسا سرویس ها به این خاطر ساخته شده اند تا بتونیم یه سری فعالیت ها رو توی پس زمینه (background) برای مدت نسبتا طولانی انجام بدیم. مثلا وقتی شما یه موزیک از تلفن همراهتون پخش می کنید و  همزمان در یک بازی مشغول می شوید و یا وارد اپلیکیشن های دیگر می شوید ، مدیا پلیر گوشی شما از سرویس استفاده کرده و در پس زمینه  داره دستور میده که آهنگ پخش بشه و اگر هم تمام شد به آهنگ بعدی برود و… .

یا مثلا وقتی یه فایل رو دانلود میکنید و همزمان هم کارهای دیگه ای هم انجام میدهید اینجاست که دانلود منیجر از سرویس استفاده کرده و پروسه رو در پشت صحنه ادامه میدهد.

یا وقتی میخواهید عملیات Tracking رو انجام بدبد و لحظه به لحظه لوکیشن گوشی را دریافت کنید و ذخیره کنید این سرویس است که به داد شما خواهد رسید.

پس فهمیدیم که سرویس ها بر خلاف اکتیویتی ها ظاهری ندارند و یا به اصطلاح فاقد
(ui (UserInterface هستند وهمچنین چرخه ی حیاتی متفاوت با اکتیوتی دارند.
البته به یاد داشته باشید که یک المان ظاهری مثل یک دکمه میتواند با سرویس در ارتباط باشد (با سرویس bind شود) و دستور آغاز و پایان آن را بدهد. و یا حتی یک view می تواند به طور مداوم با سرویس در ارتباط باشد. مثل یک seekbar در موزیک پلیر که هنگام پخش موزیک (وقتی که از موزیک پلیر خارج هستید) ، در پس زمینه می تواند روند پخش موزیک را در قسمت نوتیفیکیشن گوشی نمایش دهد.

یکی از اشتباهات رایج که دیده می شود اشتباه گرفتن مفهوم Thread ، Service و AsyncTask است. خوب است ابتدا اندکی به تعریف این سه مورد و تفاوت های آنها بپردازیم:
Thread: در حالت عادی هر پردازش و محاسبات و کدی که در برنامه اندروید وجود دارد در رشته و نخ اصلی (Main Thread) پشت سر هم اجرا می شود. اما اگر پردازش طولانی مدت  وزمان بری حدود ۵ ثانیه و بیشتر داشتیم (مثل گرفتن یک سری اطلاعات از سرور و یا وارد کردن تعداد زیادی اطلاعات در دیتابیس ) آن موقع است که اپلیکیشن از پس اجرای UI و فعالیت های عادی خود بر نمی آید(و به اصطلاح خطای ANR میدهد) چرا که همزمان با آن یک کار سنگین انجام می دهد.
اینجا است که از مفهمومی به نام Thread (نخ) باید استفاده کرد تا محاسابات زمان بر را در یک رشته ی دیگر به طور موازی انجام دهیم.
و همچنین در Thread  جدیدی که ساختیم به طور مستقیم دسترسی به المان های UI Thread (مثل دکمه ها و عکس هاو..)، نداریم به طوری که مثلا اگر درون Thread جدید ، یک TextView را از Thread اصلی مان SetText کنیم سریعا برنامه ForceClose می شود و خطای (only the original thread that created a view hierarchy) را میدهد.(البته راه حل هایی  برای حل این مشکل مثل استفاده از handler وجود دارد).
و همچنین با بسته شدن برنامه هیچ کدام از UI Thread و Thread جدید  باقی نخواهند ماند.

AsyncTask:همان Thread بهینه سازی شده است که یک سری توابع آماده دارد ، برای اینکه بتوانید به راحتی تغییراتی را از Thread دوم روی UI Thread اعمال کنید.(مثلا لحظه به لحظه میزان دانلود یک فایل در Thread دوم را در پروگرس باری در  UI Thread نمایش دهید.)

Service:سرویس یک Thread نیست.
سرویس ربطی به پردازش موازی ندارد ( البته مثل هر فعالیتی می تواند در یک Thread  جداگانه باشد) .
سرویس لزوما با خارج شدن از اپلیکیشن متوقف نمی شود.
سرویس مثل همان Activity می باشد که بی نیاز از رابط گرافیکی است.
سرویس یکی از ۴ مولفه ی مهم اندروید یعنی Service ، Activity ، BroadCast Receiver و ContentProvider است که هنگام استفاده از آنها باید در AndroidManifest معرفی شوند.

نکته: وقتی پلیکیشن به طور کامل از بین می رود ; سرویس ، Theread و یا AsyncTask از بین خواهند رفت !

خب اما طبق مستندات گوگل ، سرویس ها در اندروید به سه نوع تقسیم می شوند:

  • Scheduled(زمان بندی شده)
  • Started(آغاز شده)
  • Bound(مقید)

راجع به Scheduled ها چون تقریبا سبک متفاوتی دارند بعد از پایان این آموزش ، در یک پست دیگر صحبت میکنم ولی فعلا در حد مختصر می توان گفت:

Scheduled ها نوعی از سرویس ها هستند که برای انجام یک سری کارهای تکراری در زمان های معین ساخته شده اند ، مزایای خوبی مثل اطمینان از بسته نشدن آنها توسط سیستم عامل اندروید هست (چون هر وقت که سیستم عامل اندروید به منابع اشغال شده توسط اکتیویتی ها و سرویس ها نیاز پیدا کند این اجازه را دارد که به آنها پایان دهد.)والبته معایب وحشتناکی هم مثل مصرف بسیار زیاد باتری دارد که باید بسیار به آن دقت کرد.
AlarmManager یکی از این نوع سرویس ها هست .
در Api 21  یا همان اندروید ۵ Lollipop ، سرویس Scheduled دیگری معرفی شد به نام JobScheduler  که در بعضی از موارد مثل مصرف باتری بهینه سازی شده است.

در پست بعدی به امید خدا به سرویس های Started می پردازیم.

شما همچنین ممکن است پست های زیر را دوست داشته باشید:

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *