سلام و خسته نباشید خدمت همه
قسمت سوم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید را در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت اول و دوم دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی…

سوالات مصاحبه شغلی برنامه نویس اندروید – قسمت اول
سوالات مصاحبه شغلی برنامه نویس اندروید – قسمت دوم

۲۱. درباره سرویس ها ( Service ) را توضیح دهید

سرویس یک کامپوننت اپلیکیشن های اندروید است که عملیات های طولانی مدت در پس زمینه ( background ) را بد عهده دارد و رابط کاربری ( user interface ) ارائه نمی دهد
سرویس می تواند حتی زمانی که کاربر با اپلیکیشن شما تعامل ندارد در پس زمینه اجرا شود
سه نوع مختلف سرویس وجود دارد :
– Foreground service : این نوع سرویس عملیات هایی را اجرا می کند که مورد توجه کاربر هستند برای مثال می توانیم از این نوع سرویس برای اجرای فایل های صوتی استفاده کنیم ، یک نوتیفیکیشن باید به کاربر نمایش داده شود.
– Background service : این نوع سرویس عملیات هایی را اجرا می کند که به صورت مستقیم مورد توجه کاربر نیستند البته محدودیت هایی بعد از ارائه API 26 برای استفاده از این نوع سرویس وجود دارد و توصیه می شود در این موارد از WorkManager استفاده شود.
– Bound service : این نوع سرویس وقتی که یک کامپوننت اپلیکیشن اندروید توسط متد bindService آن را فراخوانی می کند شروع به فعالیت می کند. این نوع سرویس یک رابط client-server در اختیار می گذارد که این رابط توسط ارسال request و دریافت result اجازه تعامل با سرویس را می دهد. این نوع سرویس تنها تا زمانی که کامپوننت به آن متصل است اجرا می شود

۲۲. فرق Service و Intent Service چیست ؟

سرویس کلاس اساسی سرویس های اندروید است که می تواند به هر نوع سرویسی گسترش پیدا کند. کلاسی که از کلاس service مشتق ( extend ) شده بر روی thread اصلی اجرا می شود به همین علت نباید از این کلاس ها برای کار های طولانی مدت استفاده کرد یا اینکه برای کار های طولانی مدت باید این نوع کلاس ها را در یک thread دیگر اجرا کرد.

intent service یک کلاس مشتق شده از service است که درخواست های asynchronous ای که با عنوان intent بیان شده اند را رسیدگی می کند. کلاینت ها با فراخوانی متد startService درخواست خود را بیان می کنند و در صورت لزوم سرویسی شروع به کار می کند ،‌ کار هر intent را در thread سازنده رسیدگی می کند و زمانی که کار سرویس تمام شد آن را متوقف می کند

۲۳. فرق AsyncTask ها و Thread ها چیست؟

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

AsyncTask می توانند برای کار های کوتاه مدت استفاه شوند ، در AsyncTask ها بر خلاف Thread ها شما توانایی تغییر UI را دارید اما انجام کار های طولانی مدت توسط آن ها پرفورمنس را نابود میکنند.

۲۴. فرق Service و Intent Service و AsyncTask و Thread ها در چیست ؟

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

AsyncTask ها به شما اجازه می دهند که کار های پس زمینه ای را در UI اجرا کنید. AsyncTask کار هایی که باعث توقف UI می شوند را در پس زمینه انحام می دهد و نتیجه را به Thread رابط کاربری می آورند و دیگر نیازی به رسیدگی به Thread ها و handler ها را ندارید.

IntentService یک کلاس مشتق شده از service است که درخواست های asynchronous ای که با عنوان intent بیان شده اند را رسیدگی می کند. کلاینت ها با فراخوانی متد startService درخواست خود را بیان می کنند و در صورت لزوم سرویسی شروع به کار می کند ،‌ کار هر intent را در thread سازنده رسیدگی می کند و زمانی که کار سرویس تمام شد آن را متوقف می کند

Thread یک جریان کنترل کارهای پی در پی درون برنامه ای است. Thread ها را می توان ریز پردازش های اجرا شده در دل پردازش اصلی دانست.

۲۵. Handler ها چیستند ؟

هندلر ها آبجکت هایی برای کنترل Thread ها هستند؛ پیام هایی را دریافت می کنند و کدهایی برای چگونگی رسیدگی به پیام ها اجرا می کند ، هندلر ها خارج از چرخه حیات اکتیویتی ها اجرا می شوند ، پس نیاز است آن ها را بعد از اتمام کار پاک کرد وگرنه باعث Thread leak می شوند.
هندلر ها اجازه ارتباط Thread پس زمینه و Thread اصلی را می دهند.
از هندلر ها زمانی که می خواهیم یک کار پس زمینه ای هر x ثانیه تکرار شود هم می توان استفاده کرد.

۲۶. Job Scheduling چیست ؟

همانطور که از نام آن ها پیداست توانایی برنامه ریزی برای کار ها به صورت بهینه سازی شده نسبت به مموری ، قدرت و شرط های مربوطه را به ما می دهد.
هر JobScheduler مجموعه از کار های برنامه ریزی شده را ساپورت می کند و سیستم اندروید می تواند کار ها را به صورتی ترکیب کند تا مصرف باتری کاهش پیدا کند. JobManager کار بارگذاری را توسط هندل کردن بی اعتمادی به network به آسانی انجام می دهد. همچنین اپلیکیشن را از خطر restart شدن نجات می دهد برای مثال :

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

می توانید از این لینک ، مفصل تر راجع به Job Scheduler ها مطالعه کنید.

۲۷. رابطه چرخه حیات اکتیویتی و AsyncTask چیست ؟ چه مشکلاتی را پدید می آورد و چگونه می توان جلوی رخداد این مشکلات را گرفت ؟

چرخه حیات یک AsyncTask به چرخه حیات اکتیویتی ای که درون آن ساخته شده گرهی نخورده ، برای مثال اگر درون یک اکتیویتی یک AsyncTask را آغاز کنیم و سپس اکتیویتی را بچرخانیم ،‌ اکتیویتی نابود می شود و دوباره ساخته می شود اما AsyncTask به کارش ادامه می دهد و نابود نمی شود تا وقتی که کامل شود.
زمانی که کار AsyncTask تمام شد ، نتیجه را به سمت اکتیویتی جدید نمی برد بلکه به سمت instance سابق اکتیویتی ارسال می کند که می تواند باعث خطا شود ( خطای view not attached to window manager if you use ) و راه جلوگیری از این خطا استفاده از findViewById برای بازیابی ویو است.

این مورد پتانسیل به وجود آمد خطای نشت حافظه ( memory leak ) را تا زمانی که AsyncTask یک مرجع ( refrence ) از اکتیویتی راه نگهداری می کند به وجود می آورد چون این عمل باعث می شود اکتیویتی عمل garbage collect را تا زمانی که AsyncTask در حال اجراست به درستی انجام ندهد.

به همین دلایل استفاده از AsyncTask برای کار های طولانی مدت ایده ی جالبی نیست و برای این نوع اعمال بهتر است از مکانیزم های دیگری (مانند سرویس ها) استفاده کرد.

نکته : AsyncTask ها به صورت پیش فرض در یک Thread توسط serial executor انجام می شوند ، یعنی کار ها یکی پس از دیگری درون یک Thread انجام می شوند.

۲۸. کار متد onThrimMemory چیست ؟

این متد زمانی که سیستم عامل متوجه می شود زمانی مناسب برای تمیز کرد حافظه غیر ضروری درون process فرا رسیده فراخوانی می شود ، برای مثال زمانی که کار ها به پس زمینه منتقل می شوند و حافظه کافی برای کار های پس زمینه وجود ندارد اتفاق می افتد

اندروید از راه های مختلف حافظه مورد نیاز برای کار های بحرانی را از اپلیکیشن شما باز پس میگیرد [ حتی اگر شده اپلیکیشن شما را به کلی نابود ( kill ) می کند ] . برای کمک به تعادل حافظه سیستم و جلوگیری از نابودی process اپلیکیشن خود می توانید اینترفیس ComponentCallbacks2 را درون کلاس اکتیویتی های خود فراخوانی کنید. فراخوانی تابع onTrimMemory به شما اجازه می دهد رخداد های مرتبط با حافظه را چه در پس زمینه و چه در پیش زمینه شنود کنید و آبجکت هایی را با توجه به چرخه حیات اپلیکیشن یا رخداد هایی سیستمی [ که سیستم بازپس گیری حافظه را برای آن ها نیاز دارد ] release کنید.

۲۹. Android Bound Service :

یک نوع سرویس است که اجازه می دهد کامپوننت های دیگر اندروید ( مانند اکتیویتی ) به آن متصل شود و داده ها را ارسال و دریافت کند. نه تنها یک کامپوننت در همان process می تواند به bound service متصل شود بلکه کامپوننت هایی که در proccess های دیگر در حال فعالیتند نیز می توانند به آن متصل شوند و داده ها را دریافت و ارسال کنند.

هنگامی که یک bound service را پیاده سازی می کنیم باید آن را از service مشتق سازی کنیم، همچنین باید متد onBind را نیز override کنیم که این متد یک آبجکت را باز میگرداند که IBinder را پیاده سازی ( implement ) می کند که می توانیم از آن برای تعامل با service ها استفاده بکنیم.

پیاده سازی Bound Service توسط Android Messenger‌

سرویسی که اساس آن Messenger است می تواند با دیگر کامپوننت ها در دیگر process ها ارتباطی تحت عنوان Inter Process Communication و بدون استفاده از AIDL داشته باشد

Service Handler : این کامپوننت وظیفه رسیدگی به request های ورودی از طرف کلاینت هایی که با سرویس تعامل دارند را بر عهده دارد

Messenger : این کلاس آبجکتی را می سازد که یک اینترفیس IBinder برای تعامل کلاینت ها و سرویس پیاده سازی می کند.

۳۰. تفاوت AIDL و Messenger Queue :

Messenger Queue یک صف برای ما می سازد که توسط آن دیتا ها یا پیام هایی را بین دو process متوالی انتقال دهیم اما AIDL این دیتاها یا message ها را به صورت موازی منتقل می کند.

AIDL برای ارتباط داده ای و کنترلی در سطح اپلیکیشن استفاده می شود برای مثال سناریو زیر را در نظر بگیرید : اپلیکیشن درخواست دسترسی به لیست تمامی مخاطبین گوشی را می دهد ( این بخش داده ای است ) و هچنین می خواهد میخواهد مدت زمان تماس را نمایش دهد و هچنین از سمت اپلیکیشن تماس را قطع کند ( این بخش کنترلی است ).

در Messenger queue ها شما بیش تر درون اپلیکیشن هستید بر روی Thread ها و process هایی کار میکنید که حاوی message هستند بنابراین سرویس های خارجی دخالتی در آن ندارند.

هنگامی که از remote service استفاده میکنید به یک Messenger برای bind کردن نیاز دارید ( منظور remote service ای است که در یک process دیگ در حال اجراست )

تشکر بخاطر مطالعه مطلب

حمایت یادتان نره

سوالی بود درخدمتم

نبیل امیری