مشخصات مقاله
-
3417
-
0.0
-
7187
-
0
-
1
مدیریت چرخه حیات برنامه اندروید-چرخه حیات activity
دوره آموزش برنامه نویسی اندروید
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
آموزش اندروید و چرخه ی حیات activity
این فصل آموزشی توضیحاتی درمورد برنامه های کاربردی اندروید و چرخه ی حیات activity ارائه می دهد.
فهرست محتوا
1. مدیریت چرخه ی حیات (life-cycle) برنامه ی کاربردی اندروید
2. اپلیکیشن
3. چرخه ی حیات content provider
4. چرخه ی حیات activity
حالات مختلف activity
Life-cycle methods
پایان دهی activity ها توسط اندروید
5. حالت لحظه ای activity (instance state)
6. Nonconfiguration instance scope
7. مدیریت پیکربندی
چگونگی اجتناب از راه اندازی مجدد activity پس از تغییرات پیکربندی
نحوه ی تثبیت کردن حالت / جهت قرارگیری activity
8. تمرین : چرخه ی حیات
هدف از این تمرین
ایجاد پروژه
ساختن activity ها
تست کردن
حالت لحظه ای (instance state)
1. مدیریت چرخه ی حیات (life-cycle) برنامه ی کاربردی اندروید
به صورت ایده ال کلیه ی برنامه های کاربردی اندروید (که توسط کاربر اجرا شده اند) در حافظه باقی می مانند، این امر باعث می شود روند راه اندازی دوباره سرعت گیرد. اما همان طور که مستحضر هستید حافظه ی داخلی دستگاه اندروید بسیار محدود است. جهت مدیریت بهینه ی این منابع محدود، سیستم عامل اندروید اجازه دارد فرایندهای در حال اجرا (running processes) را خاتمه دهد یا مولفه های اندروید را بازیابی (recycle) کند.
به منظور آزاد سازی منابع (در صورت نیاز)، سیستم اندروید از تعدادی قاعده ی مشخص پیروی می کند. هریک از فرایندهای مربوطه به ترتیب زیر اولویت خاصی دریافت می کند.
در صورت نیاز سیستم اندروید پروسه ها را بر اساس سیستم اولویت بندی زیر پایان می بخشد.
جدول 1. اولویت ها
|
وضعیت پروسه |
توصیف |
اولویت |
|
پیش زمینه |
برنامه ی کاربردی که کاربر در آن با یک activity تعامل دارد یا اپلیکیشن مورد نظر سرویسی دارد که متعلق به چنین activity ای است یا با آن مرتبط و متصل است. همچنین زمانی که یک سرویس در حال اجرای یکی از متدهای چرخه ی حیات (life-cycle method) خود است یا broadcast receiver ای که متد onReceive () خود را اجرا می کند. |
1 |
|
قابل رویت |
کاربر هیچگونه تعاملی با activity ندارد، در عین حال activity تا حدی قابل رویت است یا اپلیکیشن سرویسی دارد که این سرویس توسط activity غیر فعال ولی قابل رویت مورد استفاده قرار می گیرد. |
2 |
|
سرویس |
برنامه ی کاربردی که سرویس در حال اجرا دارد اما جزئی از اولویت های تشریح شده ی بالا نیست. |
3 |
|
پیش زمینه |
برنامه ی کاربردی با activity های متوقف شده و بدون هیچگونه سرویس یا executing receiver. سیستم اندروید آن ها را در لیستی به نام LRU (least recent used) نگه می دارد و در صورت نیاز آن هایی را که کمتر از همه مورد استفاده قرار گرفته را پایان می دهد. |
4 |
|
تهی |
برنامه ی کاربردی بدون هیچگونه مولفه ی فعال |
5 |
تمامی فرایندهای اولویت 5 یا لیست " تهی " به لیست (LRU) اضافه شده و پروسه هایی که در اول این لیست قرار دارند در صورت نیاز توسطout-of-memory killer متوقف (kill) می شوند. چنانچه یک برنامه توسط کاربر دوباره راه اندازی شود، (در صورت رسیدن به پایین ترین اولویت) به انتهای صف (queue) انتقال داده می شود. این امر در تصویر زیر به نمایش گذاشته شده است.
2. اپلیکیشن
شی اپلیکیشن هر زمان که یکی از کامپوننت های اندروید راه اندازی می شود، ایجاد می گردد. شی مزبور در یک پروسه ی جدید با شناسه (ID) منحصر بفرد و تحت کاربر یکتا ایجاد می شود. حتی اگر هم شی خاصی در فایل AndroidManifest.xml ایجاد نکنید، سیستم اندروید خود یک شی پیش فرض برای شما ایجاد می کند. شی گفته شده life-cycle method های اصلی زیر را ارائه می دهد.
onCreate () – پیش از اینکه اولین مولفه های برنامه ی مورد نظر راه اندازی شوند فراخوانی می گردد.
onLowMemory () – زمانی فراخوانده می شود که سیستم اندروید به علت عدم وجود حافظه کافی از برنامه می خواهد که حافظه را آزاد ساخته یا استفاده از آن را به کمترین برساند.
onTrimMemory () – هنگامی فراخوانی می شود که سیستم عامل احساس کند، این زمان مناسبی است برای اینکه از برنامه بخواهد حافظه ی غیر لازم را از پروسه های خود رها سازد. این پیغام دربردارنده ی نشانگر (indicator) است که وضعیت یا موقعیتی که برنامه در آن قرار دارد را توصیف می کند. به طور مثال می توان به ثابت TRIM-MEMORY-MODERATE اشاره کرد که موقعیت فرایند را در جایی اواسط لیست " پیش زمینه " LRU نشان می دهد، آزاد سازی حافظه این امکان را برای سیستم فراهم می کند که فرایندهای دیگر (که در موقعیت های پایین تر در لیست قرار دارند) را جهت کارایی بهتر نگه دارد.
onTerminate () – فقط حین تست برنامه فراخوانی می شود (و نه در تولید)
onConfigurationChanged () – زمانی فراخوانی می شود که پیکربندی (config) تغییر پیدا کند.
شی برنامه ی کاربردی (app object) پیش از هر کامپوننت دیگری راه اندازی شده و حداقل تا زمانی که کامپوننت دیگری از برنامه اجرا می شود، ادامه پیدا می کند.
3. چرخه ی حیات Content Provider
Content provider تنها زمانی متوقف می شود که وضعیت کل برنامه مشخص شده و به پایان رسیده باشد (پس هیچ گاه به صورت تکی و به خودی خود متوقف نمی شود).
4. چرخه ی حیات activity
حالات مختلف activity
یک activity ممکن است بر اساس نحوه ی تعامل با کاربر در وضعیت های متفاوت قرار داشته باشد. این حالات در جدول زیر تشریح شده است.
جدول 2. حالت activity
|
حالت |
توصیف |
|
Running (در حال اجرا( |
Activity قابل رویت می باشد و با کاربر تعامل دارد. |
|
Paused (مکث شده) |
Activity هنوز قابل رویت می باشد اما تاحدی پنهان شده، نمونه در حال اجرا است ولی ممکن است توسط سیستم خاتمه یابد (کشته شود). |
|
Stopped (متوقف شده) |
Activity پدیدار یا قابل رویت نیست، نمونه در حال اجرا (فعال) است ولی امکان دارد سیستم آن را کلاً خاتمه دهد. |
|
( کشته یا کاملاً خاتمه داده شده)Killed |
Activity توسط سیستم اندروید با فراخوانی متد finish () کاملاً پایان دهی شده. |
Life-cycle methods
سیستم اندروید با استفاده از life-cycle method از پیش تعریف شده برای activity ها یک چرخه ی حیات تعریف می کند. مهمترین این متدها به ترتیب زیر هستند.
جدول 3. Life-cycle method های اصلی
|
متد |
کاربرد و هدف متد |
|
onCreate() |
ابتدا این متد فراخوانی شده، سپس activity مربوطه ایجاد می گردد. به منظور مقداردهی اولیه (initialization) activity مورد استفاده قرار می گیرد ( به عنوان مثال رابط کاربری لازمه را ایجاد می کند). |
|
onResume() |
زمانی فراخوانی می شود که activity دوباره قابل دیده شدن یا نمایان می گردد و کاربر دوباره با آن به تعامل می پردازد (کار خود را با آن دوباره ادامه می دهد). جهت مقداردهی اولیه ی field ها، ثبت گوش فراخوان (register listener)، بین سرویس ها ارتباط برقرار کردن bind to services)). |
|
onPause() |
زمانی خوانده می شود که activity ی دیگری وارد پیش زمینه شود. همیشه پیش از ناپدید شدن activity (هنگامی که activity دیگر قابل رویت نمی باشد) صدا زده می شود. بیشتر وقت ها جهت آزاد و رها سازی منابع یا ذخیره سازی داده های اپلیکیشن بکارگرفته می شود برای مثال گوش فراخوان ها، گیرنده های intent را unregister و سرویس را unbind می کند یا گوش فراخوان های خدمات سیستم (system service listener) را حذف می کند. |
|
onStop() |
هنگامی فراخوانده می شود که activity دیگر قابل رویت نیست. عملیات انبوه و سنگین Time یا shut-down CPU مثل نوشت داده به یک پایگاه داده باید در متد onMethod () غیرفعال (down) باشد. این متد در API های از 11 به بعد فراخوانی می شود. |
چرخه ی زندگی activity و مهم ترین متدهای آن در نمودار زیر به تصویر کشیده شده است.
باید توجه داشت که اندروید life-cycle method های دیگری نیز دارد ولی هیچ ضمانتی وجود ندارد که قطعاً فراخوانی شوند، در این مورد می توان به متد onDestroy () اشاره کرد (بنابراین استفاده از آن توصیه نمی شود).
پایان دهی activity ها (توسط اندروید)
همان طور که پیش تر نیز ذکر شد سیستم اندروید اجازه دارد جهت آزاد سازی منابع، activity های اندروید را recycle (بازیابی( کند. گفته می شود که سیستم اندروید اجازه دارد که خود activity ها را خاتمه دهد (terminate) ولی حقیقت امر این است که سیستم اندروید هیچگاه activity ها را تکی (به تنهایی و جدا از کل پروسه) recycle نمی کند.
توجه
یک باور اشتباه این است که اندروید تک activity ها را (جدا از کل پروسه) به طور کامل پایان می دهد (kill) اما حقیقت این است که سیستم عامل تنها فرایندها (process) را پایان می دهد.
برای اینکه مطمئن بشیم حالت ضبط شده، activity باید حالت مورد نظر را درست در زمان مناسب ذخیره کرده و restore کند و همچنین عملیات (action) غیر ضروری را در صورت قابل رویت نبودن activity متوقف ساخته تا منابع سیستم آزاد شود.
به طور معمول از متد onPause () به منظور متوقف کردن framework listener ها و بروز رسانی های رابط کاربریUI) updates) استفاده می شود و متد onStop () را جهت save کردن داده های برنامه بکار می بریم. همگی متدهای نام برده پیش از termination / اتمام activity فراخوانده می شوند. onResume () را نیز زمانی صدا می زنید که بخواهید دوباره listener ثبت کنید یا آپدیت UI را در صورت نیاز بر اساس داده های ذخیره شده فعال کنید.
علاوه بر مدیریت منابع، سیستم اندروید activity ها را در صورتی که پیکربندی به هر دلیلی تغییر داده شود، بازسازی می کند. شی Configuration حاوی کلیه پیکربندی های جاری سیستم است و چنانچه پیکربندی کنونی تغییر داده شده یا عوض شود، activity ها همگی دوباره راه اندازی می شوند (به این خاطر که activity ها برای پیکربندی جدید ممکن است از منابع مختلفی استفاده کنند).
5. حالت لحظه ای activity) instance state)
به وضعیت لحظه ای activity گفته می شود که کاربر را به همان حالتی که activity را در آن ترک کرد باز می گرداند. این در واقع داده های ناماندگار (non-persistent) برنامه ی کاربردی هستند که لازم است بین بازآغازی (restart) activity ها هنگام تغییرات پیکربندی رد و بدل (ارسال) شوند تا انتخابات یا selection کاربر را به حالت اول بازگرداند (restore). اپلیکیشن خود مسئول احیإ کردن حالت نمونه (instance state) می باشد.
تصور کنید که می خواهید در ListView خود که شامل هزاران آیتم است با استفاده از نوار scroll صفحه را بالا و پایین کنید، بدیهی است که activity بازسازی می شود. لازم به گفتن نیست که گم کردن آیتم مورد نظر و موقعیت آن در چنین لیستی زحمت زیادی را برای کاربر به دنبال دارد، به همین دلیل است که موقعیت باید به حالت اول بازگردد (حالتی که کاربر در آن activity را ترک کرد).
متدonSaveInstanceState () مسئولیت ذخیره سازی این حالت لحظه ای را به عنوان Bundle برعهده دارد. Bundle داده های نوع اولیه (primitive date types)، آرایه ها (arrays)، رشته (string) و اشیا (objects) را که یا از نوع Parcelable یا Serialisable هستند را در خود جای می دهد.
داده ی ماندگار Bundle مجرد (درست زمان) بازاغازی activity به عنوان پارامتر به متد onCreate () و onRestoreInstanceState () ارسال می شود.
اگر شما دو متد onSaveInstanceState ()و onRestoreInstanceState () را بازنویسی (override) کنید، در آن صورت لازم است کلاس پدر (parent class) آن را نیز فراخوانی کنید زیرا که view های پیش فرض اندروید داده های خود را با فراخوانی View.onSaveInstanceState از متد onSaveInstanceState() اکتیویتی، ذخیره می کنند. به طور مثال، EditText محتوای خود را با فراخوانی پیش فرض این متد ذخیره می کند.
متدهای onRestoreInstanceState () یا onCreate () را می توان جهت بازسازی محدوده ی لحظه ای (instance scope) یک activity (در صورت بازآغازی آن) به کاربرد.
نکته
توصیه می کنیم از متد onRestoreInstanceState () به منظور احیا (restore) کردن حالت لحظه ای استفاده کنید. با بهره گیری از این متد از بالا آمدن حالت اولیه (initial setup) اکتیویتی جلوگیری می کنید.
اگر کاربر هنگام ارتباط با activity دکمه ی بازگشت را فشار دهد یا متد finish () اکتیویتی فراخوانی شود، activity بیان شده از پشته ی جاری activity (activity stack) حذف شده و بازیابی (recycle) می گردد. در این مورد دیگر حالت لحظه ای (instance state) وجود نداشته و متد onSaveInstanceState() هیچگاه فراخوانده نمی شود.
چنانچه کاربر هنگام ارتباط با activity دکمه ی Home را بزند، حالت لحظه ای activity باید ذخیره شود و متد onSaveInstanceState () صدا زده شود. حال اگر کاربر اپلیکیشن را دوباره راه اندازی کند، آخرین activity فعال (در حال اجرا) از سرگرفته (resume) می شود. در صورت راه اندازی مجدد activity، کاربر Bundle و داده های ذخیره شده در آن را به متد onRestoreInstanceState () و onCreate () ارائه می دهد.
توجه
در صورتی که کاربر دکمه ی برگشت را استفاده کند، متد onSaveInstanceState () فراخوانی نمی شود. بنابراین از این متد جهت ذخیره سازی اطلاعاتی که باید ماندگار (persistant) شود استفاده نکنید.
6. Nonconfiguration instance scope
Nonconfiguration instance scope در حقیقت یک سری اشیا جاوا (java object) هستند که لازم است در صورت تغییر پیدا کردن پیکربندی (configu change) از یک instance به instance دیگری ارسال شوند.
ذخیره کرده و احیا تنها یک شی با استفاده از متدهای ()getLastNonConfigurationInstance و ()onRetainNonConfigurationInstance مقدور بود. اما متدهای مذکور مورد انتقاد قرار گرفته و بهمین دلیل توصیه می شود جهت نگه داری یا حفظ اشیایی که باید بین activity instance ها به خاطر تغییرات پیکربندی رد و بدل (pass) شوند از Headless retained fragments استفاده کنید.
توجه
اگر همچنان از متد ()onRetainNonConfigurationInstance استفاده می کنید، دقت کنید که نباید اشیإ را به instance بعدی که ارجاع به instance جاری activity دارد ارسال کنید. در غیر این صورت یک memory leak (نشت حافظه / هدر رفت حافظه) بوجود می آید، بدین معنا که garbage collector (زباله روب( قادر نخواهد بود دیگر instance های activity را پاک سازی (clean up) کند زیرا که شما هنوز در حال استفاده از ارجاع (reference) آن می باشید.
7. مدیریت پیکربندی
چگونگی اجتناب از راه اندازی مجدد activity پس از تغییرات پیکربندی
مطلع هستید که در صورت تغییر پیدا کردن نحوه ی پیکربندی (رخ دادن config change)، activity مجدد راه اندازی (restart) می شود. تغییر پیکربندی در صورتی رخ می دهد که یک رویداد (event) از دستگاه واقعی اندروید فعال یا راه اندازی (trigger) شود که ممکن است با برنامه ی کاربردی مورد نظر مرتبط باشد.
نمونه ی (instance) کلاس Configuration پیکربندی کنونی دستگاه را تعیین می کند. پیکربندی معمول شامل جهت قرارگیری (device orientation) دستگاه، مکان و پهنای موجود صفحه می شود.
به عنوان مثال در صورتی که کاربر حالت قرار گیری دستگاه را تغییر دهد (از حالت افقی به عمودی و عمودی به افقی) اندروید تصمیم می گیرد که برنامه جهت تغییر حالت قرارگیری یا نمای تصویر باید از منابع دیگری بهره گیرد و activity مورد نظر را متناسب با آن مجدد راه اندازی کند.
چنانچه activity مجدد راه اندازی شد، برنامه نویس باید درنظر داشته باشد که activity به همان حالتی که پیش از بازآغازی در آن قرار داشت برگردانده شود. سیستم اندروید برای این منظور چندین میان بر در نظر گرفته است.
در برنامه ی شبیه ساز می توان با استفاده از میان بر Ctrl+F11 نمای صفحه را تغییر داد.
برای اجتناب از بازآغازی برنامه ی کاربردی حین تغییرات پیکربندی معین، می توانید از خصیصه ی configChanges (در تعریف activity خود) در فایل AndroidManifest.xml استفاده کنید. تنظیماتی که در کد زیر اعمال شده از راه اندازی مجدد activity زمانی که نمای صفحه عوض می شود یا موقعیت صفحه کلید (پنهان / قابل رویت) تغییر پیدا می کند، جلوگیری می کند.
<activity android:name=".ProgressTestActivity"
android:label="@string/app_name"
android:configchanges="orientation|keyboardHidden|keyboard">
</activity>
نکته
سعی کنید تا حد امکان از بکارگیری صفت configChanges خودداری کنید. توصیه می کنیم به منظور مدیریت بهتر تغییرات پیکربندی از گزینه های جایگزینی همچون loader framework یا headless retained fragments استفاده کنید.
نحوه ی تثبیت کردن حالت / جهت قرارگیری activity
این امکان وجود دارد برنامه را در AndroidManifest.xml طوری تنطیم کنیم که activity را فقط در حالت مشخصی (برای مثال نمای افقی) نمایش دهد. نمونه ی این مثال را در تکه کد زیر مشاهده می کنید.
<activity android:name="com.vogella.android.multitouch.MainActivity"
android:label="@string/app_name"
android:screenorientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
8. تمرین : چرخه ی حیات
در این تمرین به کمک هم برنامه ای ایجاد می کنیم که به ما اجازه می دهد فراخوانی چرخه ی زندگی سیستم اندروید به برنامه ی کاربردی ویژه ی این سیستم عامل را مشاهده کنیم.
ایجاد پروژه
پروژه ی جدیدی به نام com.vogella.android.lifecycle.activity ایجاد کنید.
کلاس زیر را ایجاد کرده تا به وسیله ی آن رخدادهای چرخه ی حیات (life-cycle events) را از روش اخطارها دریافت کنید.
package com.vogella.android.lifecycle.activity;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.os.Bundle;
public class TracerActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
notify("onCreate");
}
@Override
protected void onPause() {
super.onPause();
notify("onPause");
}
@Override
protected void onResume() {
super.onResume();
notify("onResume");
}
@Override
protected void onStop() {
super.onStop();
notify("onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
notify("onDestroy");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
notify("onRestoreInstanceState");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
notify("onSaveInstanceState");
}
private void notify(String methodName) {
String name = this.getClass().getName();
String[] strings = name.split("\\.");
Notification noti = new Notification.Builder(this)
.setContentTitle(methodName + " " + strings[strings.length - 1]).setAutoCancel(true)
.setSmallIcon(R.drawable.ic_launcher)
.setContentText(name).build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify((int) System.currentTimeMillis()، noti);
}
}
ساختن activity ها
دو activity ایجاد کنید، اولین activity باید دومی را از طریق Intent راه اندازی می کند.
package com.vogella.android.lifecycle.activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends TracerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
Intent intent = new Intent(this، SecondActivity.class);
startActivity(intent);
}
}
package com.vogella.android.lifecycle.activity;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class SecondActivity extends TracerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
هشدار
از ثبت هر دو intent در مانیفست اندروید اطمینان کسب کنید.
تست کردن
برنامه ی کاربردی را راه اندازی کرده و دومین activity را فعال کنید. کلیه ی اختطارها را مرور کرده و سعی کنید دلیل اینکه چرا اتفاقات به این ترتیب رخ می دهند را پیدا کنید.
در activity دوم روی دکمه ی بازگشت کلیک کنید. بررسی کنید چرا onSaveInstanceState () فراخوانده نشد.
دکمه ی home را در activity دوم فشار دهید. جهت قرارگیری صفحه ی برنامه ی شبیه ساز خود را با استفاده از میان بر CTRL+F11 تغییر داده و بررسی کنید کدام life-cycle method (متدهای ویژه ی چرخه ی حیات) activity صدا زده می شوند. بررسی کنید آیا فقط activity دوم بازسازی می شود یا این اتفاق برای اولی نیز روی می دهد.
گزینه ی Don't keep activities را در تنظیمات فعال کرده و دوباره بررسی کنید کدام متدها فراخوانده می شود.
حالت لحظه ای (instance state)
یک آرایه ی رشته ای (string array) ایجاد کرده سپس با استفاده از آرایه ی نام برده یک Spinner view به اولین activity خود اضافه کنید. مثال زیر strings.xml و فایل layout بکاربرده شده توسط اولین activity را فهرست کرده است.
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<string name="app_name">Lifecycle</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string-array name="operating_systems">
<item>Ubuntu</item>
<item>Android</item>
<item>iOS</item>
</string-array>
</resources>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingbottom="@dimen/activity_vertical_margin"
android:paddingleft="@dimen/activity_horizontal_margin"
android:paddingright="@dimen/activity_horizontal_margin"
android:paddingtop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<spinner android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginright="58dp"
android:entries="@array/operating_systems" />
<button android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onclick="onClick"
android:layout_gravity="bottom"
android:text="Start new Activity" />
</linearlayout>
اندروید خود به صورت خودکار حالت یک spinner را احیا (restore) می کند. مطمئن شوید انتخاب و گزینش spinner بین تغییرات نحوه ی پیکربندی و بازآغازی activity ها توسط سیستم اندروید ذخیره گشته و احیا می شود.
حال تساوی آرایه ی ثابت (fixed array assignment) را از layout حذف کرده و آن را از طریق source code به Spinner تخصیص دهید.
// configure the spinner in code
Spinner spinner = (Spinner) findViewById(R.id.spinner);
String[] values = getResources().getStringArray(R.array.operating_systems);
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(this، android.R.layout.simple_list_item_1، values);
spinner.setAdapter(adapter);
تساوی ثابت (fixed assignment) را از فایل layout خود حذف کنید.
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingbottom="@dimen/activity_vertical_margin"
android:paddingleft="@dimen/activity_horizontal_margin"
android:paddingright="@dimen/activity_horizontal_margin"
android:paddingtop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<spinner android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginright="58dp" />
<button android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onclick="onClick"
android:layout_gravity="bottom"
android:text="Start new Activity" />
</linearlayout>
اطمینان کسب کنید موقعیت در spinner هنوز به صورت خودکار احیا (restore) می شود.
