آشنایی با Android Activity Lifecycle (بخش دوم)
در مطلب قبلی با انواع متدهای Lifecycle آشنا شدید و در ادامه با ساختن انواع اکتیوتی ها آشنا خواهید شد، با ما همراه باشید.
ایجاد اکتیویتی
اکثر تعاملات کاربر، وضعیت یک اکتیویتی فعال را تغییر میدهند و اپلیکیشن چندین بار بین اکتیویتی های مختلف جابجا میشود.
وقتی که یک اکتیویتی، اکتیویتی دیگری را ایجاد میکند، باید آنها را به هم لینک دهید. برای ایجاد اکتیویتی از ()startActivity یا ()startActivityForResult استفاده میشود و باید یک Intent را هم ارسال کنید.
ایجاد اکتیویتی بدون result
()startActivity زمانی استفاده میشود که اکتیویتی نباید نتیجه ای را برگرداند.
قطعه کد زیر نحوه ایجاد اکتیویتی با استفاده از این متد را نمایش داده است:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
علاوه بر این میتوانید عملیاتی مانند ارسال داده از یک اکتیویتی به دیگری را هم انجام دهید. در این مورد اکتیویتی فعلی میخواهد داده را به اکتیویتی هدف بفرستد. در این شرایط Intentها به کمک شما می آیند.
ایجاد اکتیویتی با result
()startActivityForResult زمانی به کار برده میشود که میخواهید اکتیویتی دیگری را شروع کنید که میخواهد از اکتیویتی که به تازگی ساخته شده، داده ای را دریافت نماید. به بیان دیگر از این متد در شرایطی استفاده کنید که میخواهید از اکتیویتی هدف جوابی دریافت کنید. برای مثال اگر اکتیویتی هدف اطلاعات کاربر را در یک دیالوگ مودال جمع آوری میکند، استفاده از این متد گزینه خوبی خواهد بود.
نتیجه اکتیویتی را در متد (onActivityResult(int requestCiode, int resultCode, Intent data دریافت خواهید کرد که به صورت یک Intent بازگردانده میشود.
مثال هایی از ایجاد اکتیویتی
در زیر مثالی از نحوه کار اکتیویتی نمایش داده شده است:
اول از همه باید یک MainActivity با استفاده از متد ()onCreate، یک فایل لی اوت و request code بسازید.
public class MainActivity extends Activity {
// Unique request code for each use case
private static final int REQUEST_CODE_EXAMPLE = 0x9345;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
در متد ()onCreate یک نمونه اولیه جدید از intent برای ایجاد اکتیویتی دوم بسازید.
وقتی برای ایجاد اکتیویتی آماده شدید، مثلا دکمه کلیک شد، باید ()startActivityForResult را که intent جدید و request code را میفرستد فراخوانی کنید.
// Create a new instance of Intent to start SecondActivity
final Intent intent = new Intent(this, SecondActivity.class);
// This starts SecondActivity with the request code
startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
باید در MainActivity ایونت های result اکتیویتی را مدیریت کنید. این کار با جایگذاری ()onActivityResult انجام میشود و بدین ترتیب از اکتیویتی دیگر نتیجه را دریافت میکنید.
به صورت زیر:
// onActivityResult only get called
// when the other Activity previously started using startActivityForResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// First we need to check if the requestCode matches the one we used.
if(requestCode == REQUEST_CODE_EXAMPLE) {
// The resultCode is set by the SecondActivity
// By convention RESULT_OK means that whatever
// SecondActivity did was executed successfully
if(resultCode == Activity.RESULT_OK) {
// Get the result from the returned Intent
final String result = data.getStringExtra(SecondActivity.EXTRA_DATA);
// Use the data - in this case, display it in a Toast.
Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show();
} else {
// setResult wasn't successfully executed by SecondActivity
// Due to some error or flow of control. No data to retrieve.
}
}
}
حال باید اکتیویتی دوم را بسازید، برای این کار از کد زیر استفاده کنید.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
final Button button = (Button) findViewById(R.id.button);
// When this button is clicked we want to return a result
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Create a new Intent object as container for the result
final Intent data = new Intent();
// Add the required data to be returned to the MainActivity
data.putExtra(EXTRA_DATA, "Some interesting data!");
// Set the resultCode as Activity.RESULT_OK to
// indicate a success and attach the Intent
// which contains our result data
setResult(Activity.RESULT_OK, data);
// With finish() we close the SecondActivity to
// return back to MainActivity
finish();
}
});
}
بستن اکتیویتی
پیش از اینکه اکتیویتی بسته شد، متدهای زیر باید فراخوانی شوند.
متد ()onPause باید تمام لیسنرها و آپدیت های UI را متوقف کند.
متد ()onStop باید داده های اپلیکیشن را ذخیره کند. در آخر متد ()onDestroy هر منبعی را که به آن اکتیویتی تخصیص داده شد، آزاد میکند. وقتی کاربر به اپلیکیشنی بازمیگردد که توسط سیستم بسته شده، متد ()onResume صدا زده میشود. لینسرها بر اساس داده هایی که ذخیره شده اند مجددا رجیستر و آپدیت های UI تریگر میشوند.
وضعیت نمونه اولیه اکتیویتی
اکتیویتی به راهی برای ذخیره سازی وضعیت های مهم و داده های دریافتی از کاربر نیاز دارد. این داده ها ممکن است از ورودی کاربر دریافت شده باشند یا وقتی اکتیویتی در حال نمایش نبوده، ساخته شده باشند.
برای مثال اگر جهت گوشی عوض شود، اکتیویتی از بین میرود و مجددا ساخته میشود. در چنین حالتی، باید مطمئن شوید که تمامی وضعیت های اکتیویتی را پیش از اینکه از بین بروند، ذخیره کرده اید و هنگام ساخت مجدد، بارگذاری کرده اید. در غیر این صورت هر داده ای که اپلیکیشن در آن لحظه دارد، کاملا از بین خواهد رفت.
برای ذخیره وضعیت اکتیویتی، میتوانید متد ()onSaveInstantState را اورراید کنید. این متد یک آبجکت Bundle را به عنوان پارامتر ارسال میکند. Bundle میتواند شامل رشته ها، انواع داده های اولیه یا آبجکت ها باشد. هر داده وضعیتی مهم را به bundle اضافه کنید. این bundle به اکتیویتی بازگردانده میشود و میتوانید وضعیت اکتیویتی را بازپس گیری کنید.
برای خارج کردن وضعیت های ذخیره شده از bundle و بازپس گیری آنها، متد ()onRestoreInstantState را جایگذاری نمایید. این فراخوانی بین متدهای ()onStart و ()onResume صورت میپذیرد.
جمع بندی
با خواندن این مقاله درک بهتری از Lifecycle اکتیویتی پیدا کردید و با روش های ایجاد اکتیویتی آشنا شدید.