چرخه حیات Activity در اندروید مبحث مهم و جالبی است که پی بردن به آن شما را با رفتار گوشی هوشمند با نرم افزار شما آشنا میسازد.
در قسمتهای قبل گفتیم کدهای اجرای نرم افزار خود را در onCreate مینویسیم، ولی چرا؟
وقتی روی آیکون نرم افزار خود کلید میکنید وارد مرحله onCreate میشویم، پس از چند لحظه وارد مرحله onStart و سپس onResume میشوید.
سورس زیر را در MainActivity خود پیاده کنید و در ماشین مجازی اجرا کنید:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}
@Override
protected void onStart() {
super.onStart();
Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show();
}
}
در ماشین مجازی هر وقت یک حالت اجرا شود، پیام Toast اجرا شدن آن به نمایش در میآید:
حالا در گوشی مجازی دکمه Back را زده و از لیست نرم افزارها دوباره برنامه خود را اجرا کنید، چه میبینید؟
درست است متد onCreate اجرا نمیشود ولی دو متد دیگر onStart و onResume به نمایش در میآیند. متد onCreate زمانی اجرا میشود که برنامه برای اولین بار اجرا میشود. زمانی که یک برنامه را باز کرده و back میزنید، برنامه در حافظه اجرا شده باقی میماند. دوباره کلید Back را بزنید و این بار کلید مربع را بزنید در این صفحه لیست برنامههایی که در حافظه باقی مانده اند را مشاهده میکنید.
در حالتی که کلید مربع را فشار داده اید با ماوس روی علامت ضربدر کلیک کنید تا برنامه از حالت اجرا خارج شود.
برنامه را دوباره از لیست نرم افزارهای خود اجرا کنید، خواهید دید این بار متد onCreate را نیز مشاهده میکنید.
پس وقتی شما در حال مشاهده صفحه نرم افزار خود هستید در واقع در حالتی قرار گرفته اید که onResume نام دارد، چون مراحل قبلی onCreate و onStart به سرعت و در کسری از زمان طی میشوند.
نکته: برای کمک گرفتن از Android Studio برای تکمیل خودکار دستوراها کافی است نام حالت مانند onCreate و یا onResume را بنویسیم تا پس از انتخاب کدهای پیشنهادی فرایند تکمیل کد برای شما اجرا شود.
تا این جا سه مرحله از حیات یک Activity را با هم شناختیم. مراحل دیگری جز مراحل ذکر شده در بالا وجود دارند که عبارت اند از:
- onPause
- onStop
- onRestart
- onDestroy
نمودار فعالیت و چرخه حیات اکتیویتیها را در پایین ببینید:
برای بررسی کامل چرخه حیات اکتیویتیهای اندروید برنامهای برای نمونه قصد داریم پیاده سازی کنیم. این برنامه از دو اکتیویتی به نامهای MainActivity و Main2Activity تشکیل شده است. هر دو اکتیویتی دارای لایه نمایش هستند که لایه نمایش اکتیویتی اول activity_main.xml و لایه نمایش اکتیویتی دوم activity_main2.xml میباشد.
در لایه نمایش اول یک کلید وجود دارد که شما را به اکتیویتی دوم هدایت میکند. در لایه نمایش دوم نیز کلیدی وجود دارد که شما را به لایه نمایش اکتیویتی اول باز میگرداند. آموزش کامل این دستورات و انتقالها در قسمت قبل آمده است.
فایل MainActivity را به صورت زیر پیاده سازی میکنیم:
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent transfer = new Intent(MainActivity.this, Main2Activity.class);
MainActivity.this.startActivity(transfer);
}
});
}
@Override
protected void onStart() {
super.onStart();
Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show();
}
@Override
protected void onStop() {
super.onStop();
Toast.makeText(this, "onStop", Toast.LENGTH_SHORT).show();
}
@Override
protected void onRestart() {
super.onRestart();
Toast.makeText(this, "onRestart", Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
}
}
در تمام حالات هفت گانه چرخه حیات اکتیویتی Toastهایی برای نشان دادن حالت فعلی برنامه وجود دارد. این Toastها به شما کمک میکنند تا بفهمید برنامه الان چه حالتی را سپری میکند.
لایه نمایش این اکتیویتی که activity_main نام دارد به صورت زیر است:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
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="hitos.ir.hitosapp.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity 1"
android:textSize="30dip"
android:id="@+id/textView"/>
<Button
>
نام اکتیویتی دوم که باید آن را به برنامه خود اضافه کنید را Main2Activity بگذارید، و سورس آن را از زیر دریافت کنید:
public class Main2Activity extends AppCompatActivity {
Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
button2= (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent transfer = new Intent(Main2Activity.this, MainActivity.class);
Main2Activity.this.startActivity(transfer);
}
});
}
}
کد فایل نمایشی activity_main2 که در این اکتیویتی وجود دارد نیز به شرح زیر است:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
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="hitos.ir.hitosapp.Main2Activity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity 2"
android:id="@+id/textView2"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textSize="30dip"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="First Activity"
android:id="@+id/button2"
android:layout_below="@+id/textView2"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="32dp"/>
</RelativeLayout>
پس از پیاده سازی برنامه فوق حالات زیر را تست کرده و تمام مراحل هفت گانه حیات اکتیویتیها را مشاهده کنید.
توجه کنید که مراحل را برای این بار به دقت و تنها یک بار و به ترتیب موجود در زیر انجام دهید. اکیدا توصیه میشود که از اندروید 4.1 در ماشین مجازی خود استفاده کنید تا نتیجه مشابهی با نتایج زیر بدست آورید:
- برنامه را اجرا کنید: در این حالت ابتدا متد onCreate و سپس onStart و در نهایت onResume را خواهید داشت.
- روی کلید Secound Activity کلیک کنید: در این حالت از اکتیویتی MainActivity به Main2Activity منتقل میشوید. در این حالت اول وارد حالت onPause و سپس onStop خواهید شد.
- روی کلید First Activity کلیک کنید: در این حالت از اکتیویتی Main2Activity به MainActivity باز میگردید. ابتدا onCreate سپس onStart و در نهایت onResume اجرا میگردد.
- در صفحه اکتیویتی اول کلید دایره را بزنید: در این مرحله صفحه اکتیویتی مخفی میشود و ابتدا وارد حالت onPause و سپس onStop میشوید.
- از صفحه منو برنامهها برنامه خود را یافته و اجرا کنید: onRestart و سپس onStart و onResume اجرا خواهند شد.
نکته مهم: البته برخی حالات ممکن است در گوشیهای مختلف با نسخه اندروید بالاتر و یا پایین تر عکس العمل متفاوتی داشته باشند، و الزاما اینگونه نیست که حتما همین عکس العملها را در تمام گوشیها تجربه کنید.
حالتهای دیگری را نیز بر حسب میل خود تست کنید تا با مراحل حیات اکتیویتیها بیشتر و بهتر آشنا شوید.