17- اکتیویتی ها - بخش دوم
آدرس مطلب اصلی: http://developer.android.com/guide/components/activities.html
نمودار چرخه حیات Activity ها (The android Activity lifecycle Diagram)
این نمودار بسیار مهم است پس بهتر است که حتماً به طور دقیق مطالعه شود.
مستطیل های خاکستری متد های call back را نشان می دهد که قبل از تغییر وضعیت (state) فراخوانی می شوند.
این نمودار را در ذیل توضیح خواهم داد.
- برای اجرا( launch ) کردن یک Activity از متد ()on create استفاده می کنیم. این جایی است که ما رابط کاربر را ایجاد می کنیم و داده ها را مقدار دهی اولیه می کنیم این متد یک Bundle object را به عنوان پارامتر می گیرد تا وضعیت رابط کاربری UI state را برگرداند(re store)
- () On start قبل از اینکه Activity برای کاربر به نمایش دراید اجرا می شود ولی Activity هنوز فعال نشده است.
- به وسیله متد On resume صفحه Activity آشکار و فعال می شود. در این حالت Activity در بالای پشته (stack) ها قرار می گیرد و در وضعیت Running/active قرار می گیرد و می تواند از کاربر ورودی بگیرد.
- در حالت فعال، زمانی که سیستم یک Activity دیگر را به بالای Stack می آورد و یا کاربر به بخش دیگری از سیستم می رود متد () On pause فراخوانی می شود.
۴- این آخرین مکان برای فراخوانی تضمین شده یک متد قبل از آن که Activity توسط سیستم kill شود، می باشد. زیرا ممکن است سیستم بدون اجرای هیچ متدی Activity را از بین ببرد بنابراین باید confy های رابط کاربر و اطلاعات مهم وحیاتی را در متد On pause ذخیره کرد.
به طور پیش فرض: یک Activity می تواند در حالت paused باقی بماند یا به آن برود اگر :
۱-کاربر دکمه home را فشار داده باشد
۲-یک Activity و یا Notification در
بالای آن قرار گیرد .
۳-دستگاه به حالت Sleep برود.
سه احتمال و امکان برای یک Activity که در حالت Paused قرار دارد، وجود دارد:
۱- کاربر به این Activity بازگردد و با فراخوانی On resume به حالت فعال (Active) برود.
۲- توسط سیستم به علت کمبود حافظه از بین برود. در این مورد هیچ متد دیگری اجرا نخواهد شد و Activity دوباره باید از ابتدا و توسط متن On create اجرا شود.
۳- در حالت های دیگر با فراخوانی متد () On stop به وضعیت stoped خواهد رفت، این کار به طور پیش فرض با فشار دادن دکمه Back و یا در حالتی که Activity جدید آن را کاملاً بپوشاند انجام می شود.
هم چنین سه سناریو برای زمانی که Activity در حالت Stopped هست وجود دارد:
۱- سیستم برای آزاد سازی منابع آن را از بین ببرد. احتمال از بین رفتن یک Activity در حالت Stopped بیشتر از حالت paused است.
برای شروع باید دوباره چرخه را با کمک متد () On create آغاز کند.
۲- با متد های ON Restart ()، On start ()، On Resume اگر کاربر به این صفحه برگردد دوباره را اندازی مجدد می شود. در این حالت رابط کاربر دست نخورده باقی می ماند و نیازی نیست که بازیابی شود.
۳- متد () On Destroy فراخوانی شود و Activity نابود شود. این آخرین متدی است که قبل از نابودی Activity می توان آن را فراخوانی کرد. این متد زمانی اجرا می شود که Activity عملکرد خود را به پایان رسانده باشد و یا سیستم موقتاً برای ایجاد فضای خالی آن را نابود کرده باشد.
حلقه ی چرخه حیات Activity
با نگاهی به نمودار چرخه حیات می توانیم ببینیم که سه حلقه برای Activity وجود دارد که توسط متد های فراخوانی
( call back) ایجاد شده اند که عبارتند از :
۱- طول عمر کامل (Entire life time):
طول عمر یک Activity که با اولین فراخوانی متد() On create آغاز می شود و با متد On Destroy به پایان می رسد.
ما تمام منابع سراسری از قبیل: Lay out ها، متغیر های سراسری و غیر را با متد () On create می سازیم و با متد OnDestroy آن ها را آزاد می کنیم.
۲- طول عمر آشکار (visible)
این مدتی است که یک Activity بین فراخوانی متدهای () On start و () On stop به حیات خود ادامه می دهد. در این مدت Activity برای کاربر آشکار است.
او ممکن است بتواند با آن در ارتباط باشد و از آن استفاده کند. در این مدت Activity وضعیت (State) خود را دست نخورده نگه می دارد.
۳- طول عمر نمایی نزدیک (Fore ground)
در بین فراخوانی متد های () On pause () , on resume رخ می دهد.
در طول آن، Activity به طور کامل برای کاربر آشکار است و در بالایی بقیه Activity ها قرار دارد در نتیجه کاربر می تواند با آن در تعامل باشد.
************************************************20
onCreate()
وقتی که Activity برای اولین بار ایجاد می شود این متد صدا زده می شود.این متد وقتی استفاده می شود که می خواهید تنظیمات استاتیک نرمال را انجام دهید مثل ایجاد کردن view ها، مقیدکردن داده ها به لیست هاو... .همچنین این متد یک Bundle شامل حالت استاتیک قبلی Activity را برای شما فراهم می کند البته اگر حالت قبلی وجود داشته باشد!همیشه بعد از این متد ، متد onStart() می آید.
onRestart()
این متد بعد از اینکه Activity ، stop شده باشد یا قبل از اینکه Activity بخواهد دوباره start شود، صدا زده می شود. همیشه بعد از این متد ، متد onStart() می آید.
onStart()
وقتی می خواهیم Activity برای کاربر قابل رؤیت باشد از این متد استفاده می کنیم. اگر بخواهیم Activity در foreground باشد بعد از این متد ، متد onResume() می آید ولی اگر بخواهیم Activity ، hidden باشد بعد از این متد، متد onStop() می آید.
onResume()
این متد وقتی استفاده می شود که Activity با کنش کاربر بخواهد start شود. دراین حالت Activity شما همراه با ورودی کاربر در بالای Activity stack قرار دارد.همیشه بعد از این متد ، متد onPause() می آید.
onPause()
این متد وقتی صدا زده می شود که Activity بخواهد وارد background شود ولی (هنوز) kill نشده است. درست برعکس onResume().وقتی Activity ب روی Activity الف launch می شود، callback از Activity الف خواسته می شود.تا وقتی که activity الف onPause نشود Activity ب نمیتواند ایجاد شود.
onStop()
وقتی استفاده می شود که هیچ Activity
برای نشان دادن به کاربر نباشد.سپس میتوانید متد های onRestart() و onDestroy() را صدابزنید یا اصلاً می توانید هیچ متدی را صدا نزنید(به Activity
بعدی کاربر بستگی دارد).
توجه کنید که این متد را می توانید هرگز صدانزنید.برای سیستم هایی که حافظه کافی
برای نگهداری فرآیندهای Activityهای
در حال اجرا ندارند بعد از متد onPause() این متد صدا زده می شود.
onDestroy()
این متد وقتی استفاده می شود که Activity را بخواهید از بین ببرید.این در دو حالت می تواند اتفاق بیفتد:وقتی که Activity به پایان می رسد(البته بعضی ها متد finish() را بکار میبرند)، وقتی که سیستم به طور موقتی این نمونه از Activity را از بین میبرد تا در فضای حافظه صرفه جویی شود.شما میتوانید این دو حالت را بامتد finishing() تشخیص دهید.
توضیحات تکمیلی:
وقتی Activity برای اولین بار اجرا شود تابع های زیر صدا زده می شود:
· onCreate()
· onStart()
· onResume()
وقتی روی دکمه phone کلیک می شود Activity به پس زمینه می رود و تابع های زیر صدا زده می شود:
· onPause()
· onStop()
وقتی صفحه Phone بسته شود تابع های زیر صدا زده می شود:
· onRestart()
· onStart()
· onResume()
وقتی دکمه بازگشت کلیک می شود یا وقتی سعی می شود که تابع finish() را برای Activity اجرا شود تابع های زیر صدا زده می شود:
· onPause()
· onStop()
· onDestroy()
حالت های Activity
سیستم عامل اندروید از یک صف اولویت برای کمک به مدیریت Activity های
در حال اجرا روی دستگاه استفاده می کند.به هر Activity خاص بر اساس حالتش یک اولویت خاص درون سیستم عامل داده
می-شود.سیستم اولویت گذاری برای شناسایی Activityها
به اندروید کمک می کند تا آنها بیش از اندازه مورد استفاده قرار نگیرند ،پس اجازه
داده شود که منابع و حافظه از آنها پس گرفته شود.موارد زیر حالت های activity را
در طول عمرش توضیح می دهد.
این حالتها را می توان به 3 گروه اصلی به شرح زیر تقسیم کرد:
1. فعال(Active) یا درحال اجرا(Running):اگر activityهادر پیش زمینه باشند فعال یا در حال اجرا هستند پس در بالای استک Activity هستند.Activity در حال اجرا بالاترین اولویت را در استک Activity دارد، و همینطور فقط توسط سیستم عامل در وضعیت نهایی از بین خواهند رفت، مثلاً اگر Activity بخواهد از حافظه ای بیشتر از حافظه در دسترس دستگاه استفاده کند آنگاه UI، unresponsive می شود.
2. حالت مکث (Pause):وقتی دستگاه به حالت sleep برود یا وقتی Activity هنوز دیده می شود اما کمی توسط Activity جدید پنهان شده است یا full-sized نیست آنگاه Activity در حالت توقف(paused) است.Activity های متوقف شده هنوز از بین نرفته اند یعنی حالت ها و اطلاعات اجزایش هنوز نگه داشته می شوند و هنوز به Windows manager وابسته خواهند بود.در استک Activity ، Activity های متوقف شده دومین اولویت را دارند وهمچنین آنها فقط توسط سیستم عامل از بین می روند آن هم وقتی که به منابع و حافظه برای ثبات و پاسخگویی به Activityهای فعال یا در حال اجرا نیاز باشد.
3. حالت Stop یا توقف: Activityهایی که کاملاً توسط Activityهای دیگر محو می شوند یا در پس زمینه هستند، Activityهای استپ شده نامیده می شوند.این Activityها هنوز تلاش می کنند تا حد ممکن حالت و اطلاعات اجزایشان را از دست ندهند اما پایینترین اولویت را دارند و همچنین سیستم عامل ابتدا این Activityها را برای منابع مورد نیاز Activityها با اولویت بالاتر از بین می برد.
ذخیره حالت activity
در مقدمه Managing the Activity Lifecycleبه طور خلاصه اشاره شد وقتی که یک activity متوقف شده است حالت activity باقی می ماند این فرضیه درست است چرا که شی activity هنوزدر حافظه نگهداری شده است وقتی متوفق می شود تمام اطلاعات وضعیت فعلی هنوز از بین نرفته است بنابراین متغیری که کاربر با استفاده از activity اعمال کرده است قابل بازیابی می باشد بنابرای وقتی activity دوباره ادامه پیدا کند این تغییرات هنوز آنجا هستند بنابراین وقتی که سیستم یک activity به منظور پوشش حافظه از بین ببرد شی activity از بین رفته بنابراین سیستم به راحتی نمی تواند حالت قبلی ذخیره شده را ادامه دهد .
تغییرات پیکربندی
برخی از وسایل اندرویدی به صورت on time تغییرمی کند از قبیل جهت نمایش صفحه ، در دسترس بودن کیبورد و زبان .هنگامی که چنین تغییری رخ دهد اندروید activity در حال اجرا را بازسازی می کند ( سیستم فرا خوانی می کند onDestroy( سپس فورا صدا می زند on create) این عملکرد به گونه ای طراحی شده است تا کمک کند به برنامه تان تا خودش را به تنظیمات جدید وفق دهد. این متد به وسیله بارگذاری اتوماتیک برنامه تان با منابع جدید جایگزین شده که شما قبلا آن را فراهم کرده بودید انجام می شود ( از قبیل layout های مختلف برای جهت ها و اندازه های مختلف صفحه نمایش) اگر شما activity تان را به درستی طراحی کنید باعث می شود تا تغییرات جهتی صفحه نمایش همگام با activity جلو برود و حالت activity را هنگام تغییرات ذخیره کند. در این صورت برنامه تان نسبت به رویداد های غیر منتظره در طول حیات activity انعطاف پذیرتر خواهد شد. بهترین راه برای رویارویی با چنین این است شروع دوباره که نتایج را ذخیره و آنها را در حال استفاده activity با استفاده از تابع های on save intent stateدوباره بازیابی کرده
هماهنگ سازی activitys
زمانی که یک activity ، یک activity دیگر را اجرا می کند هر دوی آن ها چرخه حیاتی را تجربه می کنند activity اول توقف می کند (اگرچه متوقف نخواهد شد اگر همچنان در background قابل رویت باشد )در حالی که activity دیگر ساخته شده است در حالی که این activity ها داده های ذخیره شده در دیسک یا هر جای دیگر را به اشتراک بگذارند مهم این است که activity اول به صورت کامل قبل از ایجاد activity دوم متوقف نشود بلکه process شروع activity دوم با process ،activity اول هم پوشانی دارد ترتیب چرخه حیات callback ها به خوبی تعریف شده است به ویژه زمانی که هر دو activity در یک process مشابه هستند و یکی دیگری را ایجاد می کند این ترتیب عملیات هایی می باشد که activityA ،activityB را آغاز می کند
1- متد onpaus ()، activity A را ایجاد میکند
2-متد های activity B onCreate(), onStart(), onResume() را به ترتیب اجرا میکنند .
3- پس اگر activityA دیگر روی صفحه قابل رویت نباشد متد on stop()اجرا می شود این ترتیب قابل پیش بینی چرخه حیات callbackها به شما اجازه می دهد که انتقال اطلاعات از یک activity به activity دیگر مدیریت شود به طور مثال اگر زمانی که activity اول متوقف شد، در پایگاه داده بنویسید به طوری که activity دیگر بتواند آن را بخواند و سپس باید در حین o onPause() متد on stop() در پایگاه داده نوشته شود.
- ۹۳/۰۳/۰۳
با سلام. من در برنامه م در اکتیویتی اول از کلاس مدیا پلیر استفاده کرده ام تا آهنگ هایی را پخش کند . اما مشکل اینجاست که نمی دانم چرا در هنگام اینتنت به اکتیویتی دوم، متد های onPause و بعد onStop برای اکتیویتی اول فراخوانی می شود؟
توضیح بیشتر: برای اینکه در همه اکتیویتی ها پخش شود در متد onPause مربوط به اکتیویتی اول (که کلاس مدیا پلیر رو در آن تعریف کرده بودم) player. start را نوشته و برای اینکه در هنگام خروج موقت از اکتیویتی (مثلا رفتن به صفحه خانه یا در هنگام تماس) آهنگ قطع شود،در متد onStop اکتیویتی اول player.pause را نوشتم و برای مراجعت دوباره به برنامه در onRestart متد player.start را نوشتم. اما در اینتنت به اکتیویتی دوم، نمی دانم چرا onStop هم بعد از onPause فراخوانی شده و آهنگ را متوقف می کند.
با تشکر فراوان