برنامه نویسی اندروید - دانشگاه صنعتی قم

این وبلاگ کانال ارتباطی با دانشجویان درس«برنامه نویسی موبایل» دانشگاه صنعتی قم می باشد.

برنامه نویسی اندروید - دانشگاه صنعتی قم

این وبلاگ کانال ارتباطی با دانشجویان درس«برنامه نویسی موبایل» دانشگاه صنعتی قم می باشد.

محتویات این وبلاگ با هدف آموزش اندروید در دوره درسی "برنامه نویسی موبایل" در دانشگاه صنعتی قم توسط اینجانب گردآوری شده است.
تعداد زیادی از مطالب ترجمه شده در این وبلاگ توسط دانشجویان دانشگاه صنعتی قم به عنوان پروژه های این درس ترجمه شده است.
در صورتی که تصمیم به تماس با من دارید، می توانید از طریق آدرس ایمیل qut دات android در جی میل دات کام با من تماس بگیرید.
-------------------
اگر بتوانم به شما کمکی در زمینه برنامه نویسی اندروید بکنم، خوشحال خواهم شد با این حال اگر پرسشی را ارسال کردید و بنده نیز به دلیل مشکلات و مشغله نتوانستم پاسخگو باشم، پوزش بنده را پیشاپیش پذیرا باشید.
-------------------
چون افراد زیادی از من درخواست می کنند تا برنامه نویسان اندروید به خصوص در شهر قم را به آنها معرفی کنند، اگر تمایل دارید رزومه و یا مشخصات خود را برایم ارسال کنید تا در صورت وجود درخواستهایی از این دست به شما اطلاع دهم.
از نظر من محدویتی به شهر قم وجود ندارد، لذا اگر برنامه نویس اندروید در شهرهایی دیگر هستید و یا به دنبال نیروی برنامه نویس اندروید هستید با من در تماس باشید، شاید بتوانم در این زمینه به شما کمکی بکنم :)
ناگفته نماند از آنجایی که در فضای مجازی من شناختی از هیچ شخص یا شرکتی ندارم، اگر شخصی به دنبال نیروی کار باشد، به افرادی که با مشخصات درخواستی ایشان تطابق داشته باشند، اطلاع خواهم داد و توصیه می شود برنامه نویسان محترم نیز قبل از شروع به همکاری، ملاحظات لازم در این زمینه را به عمل آورند چون من نیز شناختی از طرف مقابل ندارم.

طبقه بندی موضوعی

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 فراخوانی شده و آهنگ را متوقف می کند.

با تشکر فراوان
پاسخ:
برای توقف مدیاپلیر صرفاً در هنگام خروج از اکتیویتی می توانید دستورات توقف مدیاپلیر را در متد onDestroy فراخوانی کنید به جای onPause یا onStop.

کلاً onStop با دیده نشدن Activity صدا زده می شود. اما onDestroy در زمان خروج و حذف آن Activity از چرخه اکتیویتی ها.

برای توضیحات بیشتر یک نگاه به پاسخ درج شده برای این سؤال بکنید:
http://stackoverflow.com/questions/8515936/android-activity-life-cycle-what-are-all-these-methods-for

ارسال نظر

کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی