Site icon آکادمی آمانج

آشنایی با سرویس‌ها در اندروید

سروس در اندروید

سرویس یکی از کامپوننت‌های پرکاربرد در سیستم عامل اندروید محسوب می‌شود. از کامپوننت سرویس برای اجرای عملیات و پردازش‌های طولانی مدت و تکرار شونده در پس زمینه (Background) استفاده می‌شود. پردازش‌هایی که ارتباطی با رابط کاربری (UI) نداشته و باید بدور از چشم کاربر انجام شود. در این مقاله در مورد مفهوم سرویس در اندروید، انواع و کاربرد آن توضیح خواهیم داد.


مطالعه مقاله «کامپوننت های اصلی اندروید و کاربرد آن‌‌ها» به شما توصیه می‌شود»


 

سرویس چیست؟

Service یک کامپوننت نرم افزاری است که در پس زمینه اجرا شده و مستقیما با کاربر تعامل ندارد. از آنجایی که سرویس فاقد رابط کاربری است، طبیعتا به چرخه ی حیات یک activity نیز متصل نمی باشد.

سرویس ها اغلب برای انجام عملیات تکراری و طولانی مورد استفاده قرار می گیرند. از جمله ی این عملیات می توان به دانلود از اینترنت، بررسی و جستجو برای داده های جدید، پردازش اطلاعات، بروز آوری content provider ها و موارد مشابه اشاره کرد.

سرویس ها دارای اولویت سطح بالاتری نسبت به activity های غیرفعال/غیر قابل مشاهده در UI هستند و از این رو احتمال اینکه اندروید آن ها را به صورت خودکار خاتمه دهد بسیار پایین است.

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

می توان به سرویس ها اولویت یکسان و برابر با ACTIVITY های حاضر در پیش زمینه (FORGROUND) اختصاص داد. در این سناریو لازم است یک notification قابل مشاهده و فعال در UI برای سرویس های مربوطه لحاظ نمایید. این روش بیشتر برای سرویس هایی بکار می رود که یک فایل ویدیویی یا موسیقی را پخش می کند.

 

سرویس ها و پردازش پس زمینه ای (background processing)

به صورت پیش فرض، سرویس در همان فرایندی اجرا می شود که thread اصلی اپلیکیشن در آن حال اجرا است. به همین جهت توسعه دهنده بایستی از پردازش ناهمزمان در سرویس استفاده نموده و task هایی که هزینه بر و سنگین هستند را در پس زمینه راه اندازی کند. یکی از الگوهایی که مکررا برای پیاده سازی سرویس بکار می رود، اجرای یک Thread جدید در سرویس جهت انجام پردازش در پس زمینه و خاتمه دادن سرویس به هنگام اتمام پردازش می باشد.

سرویس هایی که در بستر فرایند خود اپلیکیشن اجرا می شوند معمولا تحت عنوان service های محلی یا local شناخته می شوند.

 

 

 

سرویس های خود محیط اندروید (platform) و سرویس های اختصاصی

محیط اندروید سرویس های آماده و از پیش تعریف شده ای را درنظر گرفته و راه اندازی می کند که تمامی اپلیکیشن های اندرویدی، در صورت برخوردار بودن از مجوزهای لازم قادر به استفاده از آن ها استفاده می باشند. سرویس های سیستم را کلاسی به نام Manager در اختیار اپلیکیشن ها قرار می دهد.کافی است برای دسترسی به آن متد getSystemService() را فراخوانی نمایید.

کلاس Context تعدادی ثابت فراهم می کند که شما با استفاده از آن ها می توانید سرویس های نام برده را فراخوانی کنید.

اپلیکیشن اندروید می تواند علاوه بر سرویس های پیش فرض سیستم اندروید، سرویس های اختصاصی تعریف نموده و از آن ها در کنار سرویس های سیستم استفاده نماید.

توسعه دهنده قادر است با پیاده سازی سرویس های اختصاصی خود اپلیکیشن های پاسخگو و تعاملی (responsive) طراحی نماید. شما می توانید داده های اپلیکیشن را به وسیله های سرویس واکشی نموده و زمانی که اپلیکیشن راه اندازی شد، داده های جدید در اختیار کاربر قرار دهید.

 

راه اندازی و تعریف سرویس های اختصاصی

سرویس های اختصاصی اغلب توسط کامپوننت های دیگر راه اندازی می شوند، به عبارت دیگر سایر اجزا نرم افزاری اپلیکیشن های اندرویدی نظیر activity ها، broadcast receiver ها و سرویس های دیگر هستند که سرویس های اختصاصی را راه اندازی می کنند.

 

سرویس های پیش زمینه (foreground)

سرویس پیش زمینه سرویسی است که از نظر اولویت و اهمیت با یک activity فعال و قابل مشاهده در UI یکسان است و به همین جهت حتی اگر سیستم اندروید با کمبود حافظه مواجه باشد باز هم اجازه ی حذف از آن ها حافظه را ندارد. سرویس foreground می بایست در نوار نشان دهنده ی وضعیت کلی سیستم (status bar) یک اطلاعیه یا notification در زیر بخش عنوان “Ongoing” مختص به خود داشته باشد. این بدین معنی است که تا زمان حذف سرویس از foreground یا حافظه، notification قابل dismiss و حذف از status bar نخواهد بود.

 

تعریف سرویس های اختصاصی

پیاده سازی و اعلان

فرایند راه اندازی و اجرای سرویس

متوقف کردن یک سرویس

متصل کردن دوطرفه ی سرویس ها (service binding)

وصل شدن از activity ها به سرویس ها

اتصال به سرویس های محلی

اتصال به سرویس با استفاده از IPC

اجرای سرویس ها در فرایندهای مجزا

اجرای یک سرویس در فرایند مختص به خود

تبادل داده و ارتباط با سرویس ها

 

 

 

 

روش های مختلف برای برقراری ارتباط با سرویس ها

راه های مختلفی برای تبادل داده و تعامل بین activity و سرویس وجود دارد. مطالب زیر روش های ممکن برای نیل به این هدف را نام برده و روش پیشنهادی خود را در اختیار شما قرار می دهد.

استفاده از داده های کپسوله شده در intent

در یک سناریوی ساده، نیازی به هیچ تعامل مستقیم (بین سرویس و activity) وجود ندارد. سرویس داده های کپسوله شده در intent را از کامپوننت آغاز کننده (فراخواننده ی سرویس) دریافت نموده و عملیات لازم را به انجام می رساند. لازم به ذکر است که برای این منظور notification ضروری نیست. در واقع در شرایطی که سرویس محتوای یک content provider را با داده های جدید بروز آوری می کند، خود کامپوننت نرم افزاری مزبور activity را از این رخداد با خبر کرده و هیچ اقدام یا مرحله ی دیگری در سرویس لازم نیست. این روش هم برای سرویس های محلی و هم برای سرویس هایی که در فرایند مختص به خود اجرا می شوند، قابل پیاده سازی و استفاده خواهد بود.

 

استفاده از receiver

می توان برای تعامل و ارتباط بین activity و سرویس ها از broadcast ها و receiver هایی که به این broadcast ها گوش می دهند، بهره گرفت. به عنوان مثال، activity شما می تواند یک broadcast receiver برای گوش دادن به event ای معین ثبت کند و سرویس مورد نظر اتفاق افتادن event های مربوطه را به بیرون (کاپوننت های دیگر) اعلان نماید. این روش بسیار معمول بوده و اغلب زمانی استفاده می شود که سرویس می بایست پس از به انجام رساندن پردازش به activity این اتفاق را اعلان کند.

روش نام برده برای سرویس های محلی و سرویس هایی که در فرایند میزبان و مختص خود اجرا می شوند، قابل استفاده می باشد.

 

اتصال activity به سرویس محلی

چنانچه activity و service هر دو در فرایندی یکسان اجرا شوند، در این شرایط activity قادر خواهد بود به سرویس مستقیما به صورت دو طرفه وصل شود. روش حاضر از میان گزینه هایی که تاکنون عنوان شده، بهینه ترین بوده و برای زمانی که activity نیاز دارد با سرویس با سرعت بالا تبادل داده داشته باشد بسیار مناسب می باشد.

ناگفته نماند که این روش تنها برای سرویس های محلی (سرویس هایی که) قابل پیاده سازی و استفاده می باشد.

 

Handler و ResultReceiver یا Messenger

چنانچه سرویس با activity تعامل دو طرفه داشته باشد (اطلاعاتی را به activity برگرداند)، در آن صورت می تواند از طریق داده های کپسوله شده در intent که از activity دریافت می کند، آبجکتی از جنس Messenger دریافت نماید. در صورتی که Messenger به Handler در activity متصل باشد، آنگاه service قادر خواهد بود آبجکت هایی از جنس Message را به activity ارسال نماید.

Messenger در واقع اینترفیس parcelable را پیاده سازی می کند، بدین معنی که می توان آن را به فرایند دیگر ارسال کرده و با استفاده از این آبجکت Message هایی را به Handler در activity ارسال نمود.

Messenger همچنین متدی به نام getBinder را ارائه می دهد. این متد قابلیت ارسال آبجکتی از جنس Messenger به activity را فراهم می نماید. activity نیز متعاقبا قادر خواهد بود Message های (نمونه هایی از کلاس Message که حاوی توصیف و آبجکت های داده ای دلخواه می باشد) متعددی را به سرویس مورد نظر ارسال کند.

این روش برای سرویس های محلی که در فرایند خود اجرا می شوند، قابل استفاده می باشد.

 

اتصال به سرویس در فرایند دیگر با استفاده از AIDL

به منظور تبادل داده و اتصال (bind) به سرویسی که در فرایند دیگری در حال اجرا است، برنامه نویس بایستی از IPC (ارتباط میان پردازشی) کمک بگیرد. برای نیل به این هدف، ابتدا لازم است یک فایل AIDL ایجاد کند که تقریبا مشابه interface های جاوا می باشد با این تفاوت که پسوند آن .aidl بوده و تنها اجازه ی ارث بری و بسط دیگر فایل های AIDL را دارد.

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

 

جمع‌ بندی

در این مطلب با مفهوم سرویس در اندروید، انواع آن و راه اندازی سرویس‌ها به صورت مختصر توضیحاتی را ارائه دادیم. در آخر بد نیست نکاتی را نیز در این مورد بیان کنیم.

مشاهده نسخه گرافیکی و کامل