در زندگی روزمره همه ما با تعدادی برنامه کاربردی تلفن همراه روبرو هستیم که در پسزمینه اجرا میشوند. همچنین در بسیاری از برنامهها، کارهای خاصی بدون استفاده از Ui انجام میشود، به بیان دیگر وظیفه خاصی در پسزمینه انجام میشود. به عنوان مثال، اپلیکیشن موزیک موبایل و یا هر اپلیکیشن موزیک دیگری در پسزمینه در حال اجرا است، میتوانید درحالی که از اپلیکیشن موزیک استفاده میکنید، به طور عادی از هر برنامه دیگری استفاده کنید. بنابراین این ویژیگی با پیادهسازی service یا IntentService انجام میشود.
در این مقاله به بررسی تفاوت بین Service و IntentService خواهیم پرداخت. اما قبل از حرکت به جلو، ما یک مرور سریع در مورد Service و IntentService خواهیم داشت. پس بیاید شروع کنیم.
Service
میتوانید سرویسها را بهعنوان یک مولفه اندرویدی در نظر بگیرید که برای برخی عملیات طولانی مدت که در پسزمینه انجام میشوند مانند برنامه موسیقی استفاده کنید، جایی که برنامه را در پسزمینه اجرا میکنیم و از برنامههای دیگر به صورت موازی استفاده میکنیم. بهترین بخش آن، این است که برای انجام عملیات در پسزمینه نیازی به ارائه Ui ندارید. با استفاده از سرویس، میتوانید ارتباطات بین پردازش(IPC) را نیز انجام دهید. بنابراین، با کمک سرویس میتوانید چندین عملیات را با هم انجام دهید، زیرا هر مولفه برنامه میتواند یک سرویس را شروع کند و در پسزمینه اجرا شود.
سه روش برای استفاده از سرویس وجود دارد:
- Foreground: در این روش سرویس به کاربر اجازه میدهد تا از آنچه در پسزمینه اتفاق میافتد مطلع شود. بهعنوان مثال در اپلیکیشن موسیقی، کاربر میتواند آهنگ در حال اجرا را در دستگاه بهعنوان یک اعلان ببینید. بنابراین، اینجا نمایش اعلان ضروری است.
- Background: در اینجا کاربر هرگز درباره آنچه که در پسزمینه برنامه اتفاق میافتد مطلع نمیشود. برای مثال، هنگام ارسال برخی تصاویر از طریق واتساپ؛ واتساپ فایل تصویری را فشرده میکند تا تا اندازه آن کاهش یابد. این کار در پسزمینه انجام میشود و کاربر درباره آنچه رخ میدهد خبر ندارد. اما در API سطح 21 و یا بالاتر، سیستم اندروید هنگام استفاده از سرویس پسزمینه محدودیتهایی را اعمال میکند. بنابراین قبل از استفاده از این نوع سرویس مراقب این محدودیتها باشید.
- Bound: از bound سرویس زمانی استفاده میشود که یک یا بیش از یک مولفه از برنامه با استفاده از متد bindService() به سرویس متصل میشوند. اگر برنامهها اتصال به سرویس را قطع کنند، سرویس از بین میرود.
IntentService
سرویس کلاس پایه برای IntnetService است. در اصل، از الگوی "صف کار فرایندها" استفاده میکند که IntentService درخواستها را براساس تقاضا(Intent) کلاینتها را کنترل کند. بنابراین هرگاه کلاینت درخواستی را ارسال کند، سرویس شروع میشود و پس از رسیدگی به هر Intent سرویس متوقف میشود. کلاینت میتواند با ارسال (Context.StartService(Intent درخواست راهاندازی یک سرویس را ارسال کند. در اینجا، یک thread کارگر ساخته میشود و کلیه درخواستها با استفاده از این thread رسیدگی میشود، اما در هر لحظه فقط یک درخواست پردازش میشود.
برای استفاده از IntentService باید IntentService را extend کنید و onHandleIntent() را پیادهسازی کنید.
تفاوت بین Service و IntentService
ما تا الان مفهوم سرویس و intentService را مرور کردیم. آیا تا الان هیچ تفاوتی بین این دو پیدا کردهاید؟ اگر پیدا نکردهاید، نگران نباشید، در این بخش به بررسی برخی از تفاوتهای این دو خواهیم پرداخت، بنابراین، شما راحتتر میتوانید بفهمید که در هر شرایط از کدام استفاده کنید. بیایید تفاوتهای مهم را ببینیم:
- کاربرد: اگر میخواهید یک کار در پسزمینه برای مدت طولانی انجام شود از IntentService استفاده میشود، اما در عین حال، باید مواظب باشید که هیچ ارتباطی با thread اصلی برقرار نباشد و یا ارتباط بسیار ضعیفی برقرار باشد. اگر ارتباطی نیاز باشد میتوانید از handler و یا broadcast intent استفاده کنید. میتوانید از سرویس برای کارهایی استفاده کنید که به هیچ Ui نیاز ندارند و همچنین خیلی طول نمیکشند.
- نحوه استفاده: برای شروع یک سرویس باید متد onStartService() را صدا بزنید در حالیکه برای شروع یک IntentService باید (Context.startService(Intent صدا بزنید.
- Thread درحالاجرا: سرویس همیشه در thread اصلی اجرا میشود در حالیکه IntentService در thread کارگر جداگانهای اجرا میشود که از thread اصلی راهاندازی میشود.
- راهاندازی thread: سرویس را میتوان از هر thread راهاندازی کرد، در حالیکه IntentService فقط میتواند از thread راهاندازی شود. به بیانی دیگر ابتدا، intent در thread اصلی دریافت میشود و بعد از آن، thread کارگر اجرا میشود.
- مسدود کردن thread اصلی: اگر از سرویس استفاده میکنید احتمال اینکه thread اصلی شما مسدود شود وجود دارد، زیرا سرویس روی thread اصلی اجرا میشود. اما در مورد IntentService هیچ مشکلی در مورد thread اصلی وجود ندارد. در اینجا، کارها به صورت صف اجرا میشود یعنی به این صورت که هر کار ابتدا وارد شود آن کار اجرا میشود(FCFS).
- توقف سرویس: اگر شما از سرویس استفاده میکنید، پس از استفاده باید سرویس را متوقف کنید در غیر اینصورت برای مدت زمان نامحدود در آنجا خواهد بود یعنی تا زمانی که تلفن شما در حالت عادی قرار گیرد. بنابراین، برای متوقف کردن یک سرویس، شما باید از stopSelf() یا stopService() استفاده کنید. اما در مورد intentService دیگر نیازی به متوقف کردن سرویس نیست، زیرا این سرویس پس از انجام کار به طور خودکار متوقف میشود.
- تعامل با Ui: اگر شما از Ui استفاده میکنید، تعامل با Ui برنامه دشوار خواهد بود. اگر میخواهید نتیجه کار IntentService خود را در Ui ببینید، بنابراین باید از اکتیویتی کمک بگیرید.
نتیجه
در این مقاله، ما برخی از تفاوتهای سرویس و intentService را در اندروید آموختیم. همچنین در مورد برخی از روشهای راهاندازی و متوقف کردن سرویس و IntentService بحث کردیم. اگر تعداد محدودی از کار را میخواهید در پسزمینه انجام دهید پس از سرویس استفاده کنید، در غیر اینصورت از IntentService استفاده کنید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید