پروسس ها و چرخه حیاط اپلیکیشن
در بیشتر موارد، هر برنامه اندروید در فرایند لینوکس خود اجرا می شود. این فرایند برای برنامه زمانی ایجاد می شود که برخی از کد های آن باید اجرا شود، و تا زمانی که دیگر لازم نباشد،در این مواقع سیستم حافظه خود را برای استفاده از برنامه های دیگر بازیابی می کند.
یک ویژگی غیر معمول و اساسی اندروید این است که طول عمر درخواست برنامه به طور مستقیم توسط برنامه کاربردی کنترل نمی شود. در عوض، توسط سیستم از طریق ترکیبی از قسمت های برنامه که سیستم می داند در حال اجرا است، چقدر این موارد برای کاربر اهمیت دارد و چقدر حافظه کلی در سیستم موجود است.
نکته مهم این است که توسعه دهندگان نرم افزار درک کنند که چگونه اجزای برنامه کاربردی (به ویژه فعالیت، سرویس، و BroadcastReceiver) طول عمر پروسس برنامه را تحت تاثیر قرار می دهند. عدم استفاده از این اجزاء به درستی می تواند باعث بروز فرایند برنامه در هنگام انجام کار مهم شود.
یک مثال معمول از یک اشکال چرخه حیات پروسس BroadcastReceiver است که وقتی یک Intent را در روش () BroadcastReceiver.oneceive دریافت می کند یک رشته را می گیرد و سپس از تابع بر می گرداند.
پس از بازگشت، سیستم BroadcastReceiver را غیر فعال می کند و بنابراین فرایند میزبانی آن دیگر مورد نیاز نیست (مگر اینکه اجزای دیگر برنامه در آن فعال باشند). بنابراین، سیستم ممکن است در هر لحظه فرآیند را برای بازیابی حافظه از بین ببرد و در انجام این کار، فرایند در حال اجرا متوقف می شود. راه حل این مشکل معمولا یک برنامه ریز JobService از BroadcastReceiver کارها را برنامه ریزی می کند، بنابراین سیستم می داند که در این فرایند کار هنوز در حال انجام است.
برای تعیین اینکه چه فرایندهایی باید هنگام کاهش حافظه از بین برده شود، آندروید هر فرآیند هارا به صورت سلسله مراتبی مرتب می کند که بر اساس اجزای موجود در آنها و وضعیت این اجزا می باشد. این انواع فرایند (به ترتیب اهمیت) شامل:
1 – یک فرایند پیش که برای آنچه کاربر در حال انجام است مورد نیاز است. اجزای مختلف نرم افزار می توانند فرآیند حاوی آن را به روش های مختلف در نظر بگیرند. اگر هر یک از شرایط زیر را داشته باشد فرایند در نظر گرفته می شود:
1 – 1 – یک اکتیویتی در حال اجرا که کاربر با آن تعامل دارد (روش () onResume آن نامیده شده است).
1 – 2 – این BroadcastReceiver است که در حال حاضر اجرا می شود (() BroadcastReceiver.onReceive آن اجرا می شود).
1 – 3 – یک سرویس که در حال حاضر کد را در یکی از( callbacksService.onCreate ()،() Service.onStart ، یا () Service.onDestroy) اجرا می کند.
تنها چندین پروسه در این سیستم وجود خواهد داشت و این تنها به عنوان آخرین راه حل کشته خواهد شد اگر حافظه بسیار کم باشد که حتی این پروسه ها نمی توانند ادامه دهند. به طور کلی، در این مرحله، دستگاه به وضعیت پیمایش حافظه رسیده است، بنابراین این عمل لازم است تا رابط کاربر را پاسخگو باشد.
تنها چندین پروسه در این سیستم وجود خواهد داشت و اخرین راه از بین بردن پروسس اگر حافظه بسیار کم باشد و یا حتی این پروسه ها نمی توانند به کار خود ادامه دهند. به طور کلی، در این مرحله، دستگاه به وضعیت پیمایش حافظه رسیده است.
2 – یک سری از کار هایی است که کاربر در حال حاضر از آن آگاه است، بنابراین از بین بردن ای فعالیت ها تاثیر منفی بر تجربه کاربر دارد. فرآیند در شرایط زیر قابل مشاهده است:
2 – 1 – یک فعالیت که برای کاربر بر روی صفحه نمایش قابل مشاهده است، اما نه در پیش زمینه (روش () onPause آن نامیده می شود). مثلا ممکن است این اتفاق بیافتد، اگر فعالیت پیشین به عنوان یک محاوره نمایش داده شود که اجازه می دهد که فعالیت قبلی در پشت آن دیده شود.
2 – 2 – این سرویس دارای خدماتی است که از طریق () Service.startForeground (که درخواست سیستم را به عنوان چیزی که کاربر از آن آگاه است یا اساسا برای آنها قابل مشاهده است) به عنوان سرویس پیش زمینه ای اجرا می کند.
2 – 3 – یک سرویس که سیستم برای ویژگی خاصی که کاربر از آن آگاه است استفاده می کند مانند تصویر زمینه زنده، سرویس ورودی ورودی و غیره.
3 – یک فرایند سرویس اجرای یک سرویس است که با استفاده از روش () startService آغاز شده است. اگر چه این فرآیندها به طور مستقیم برای کاربر قابل مشاهده نیستند، عموما کارهایی را انجام می دهند که کاربر در مورد آن مراقبت می کند (مانند آپلود یا دانلود داده های شبکه های پس زمینه)، بنابراین سیستم همیشه این پروسه ها را اجرا می کند مگر اینکه حافظه کافی برای حفظ تمام پیش زمینه و فرآیندهای قابل مشاهده نداشته باشد.
خدماتی که برای مدت زمان طولانی اجرا شده اند (از قبیل 30 دقیقه یا بیشتر) ممکن است از اهمیت زیادی برخوردار باشند تا اجازه دهند فرایند خود را به فهرست LRU ذخیره شده که در ادامه توصیف شده اند، رها کنند. این کمک می کند تا از شرایطی که سرویس های بسیار طولانی که حافظه یا RAM بسیار زیاد را از بین می برد و مانع از استفاده سیستم از پروسه های ذخیره سازی شده در حافظه می شود جلوگیری شود.
4 – یک فرایند ذخیره سازی شده است که در حال حاضر مورد نیاز نیست. بنابراین سیستم آنرا از بین می برد تا از حافظه ی آزاد شده برای قسمت هایی که لازم است استقاده کند. در رفتار معمولی سیستم، این تنها فرایندهای درگیر در مدیریت حافظه است: یک سیستم خوب در حال اجرا فرآیندهای ذخیره سازی چندگانه همیشه در دسترس (برای تغییر کارایی بهتر بین برنامه ها) و به طور مرتب قدیمی ترین موارد را در صورت نیاز از بین می برد. تنها در موقعیت های بسیار بحرانی (و ناخواسته) سیستم به نقطه ای می رسد که تمام فرآیندهای ذخیره شده را از بین می برد و باید شروع به از بین بردن فرایندهای سرویس کند.
این فرآیندها اغلب یک یا چند مورد فعال را که در حال حاضر برای کاربر قابل دیدن نیستند نگه می دارند (متد () onStop ). با در نظر داشتن اینکه چرخه عمر فعالیت خود را به درستی طی می کند، هنگامی که سیستم چنین فرایندهایی را از بین می برد، در هنگام بازگشت به آن کاربر را تحت تاثیر قرار نمی دهد: می تواند وضعیت قبلی ذخیره شده را با فرایند جدید اعمال نمود.
این فرآیندها در فهرست شبه LRU نگهداری می شوند، فرایندی که آخرین سطح در لیست قرار دارد برای بازیابی حافظه اول از بین می رود. خط مشی دقیق سفارش به این لیست، جزئیات اجرایی پلت فرم است، اما به طور کلی سعی دارد فرآیندهای مفیدتری را (آخرین Activity که کاربر آنرا دیده است و غیره) را قبل از انواع فرآیندها نگه دارد. ساير سياست ها براي از بین بردن فرآيندها نيز ممکن است اعمال شوند: محدوديت هاي سختي بر تعداد پروسه ها مجاز، محدوديت هاي زماني که فرآيند مي تواند بطور مداوم در حافظه ذخيره شود و …
برای تصمیم گیری در مورد چگونگی طبقه بندی یک فرایند، سیستم تصمیم گیری خود را بر اساس مهم ترین سطح در میان تمام اجزای موجود در حال حاضر در این فرایند ها انتخاب می کند.اولویت فرایند نیز می تواند بر اساس وابستگی های دیگر که فرآیند به آن نیاز دارد، افزایش یابد.
وضعیت پروسه | توصیف | اولویت |
---|---|---|
پیش زمینه | برنامه ی کاربردی که کاربر در آن با یک activity تعامل دارد یا اپلیکیشن مورد نظر سرویسی دارد که متعلق به چنین activity ای است یا با آن مرتبط و متصل است. همچنین زمانی که یک سرویس در حال اجرای یکی از متدهای چرخه ی حیات (life-cycle method) خود است یا broadcast receiver ای که متد onReceive () خود را اجرا می کند. | 1 |
قابل رویت | کاربر هیچگونه تعاملی با activity ندارد، در عین حال activity تا حدی قابل رویت است یا اپلیکیشن سرویسی دارد که این سرویس توسط activity غیر فعال ولی قابل رویت مورد استفاده قرار می گیرد. | 2 |
سرویس | برنامه ی کاربردی که سرویس در حال اجرا دارد اما جزئی از اولویت های تشریح شده ی بالا نیست. | 3 |
پیش زمینه | برنامه ی کاربردی با activity های متوقف شده و بدون هیچگونه سرویس یا executing receiver. سیستم اندروید آن ها را در لیستی به نام LRU (least recent used) نگه می دارد و در صورت نیاز آن هایی را که کمتر از همه مورد استفاده قرار گرفته را پایان می دهد. | 4 |
تهی | برنامه ی کاربردی بدون هیچگونه مولفه ی فعال | 5 |
دیدگاهتان را بنویسید