وقتی کاربر با یک اپلیکیشن روی دستگاه اندرویدی کار می کند، تقریبا همیشه دارد با یک Activity (یک صفحه ی منفرد که صفحه دستگاه روی آن تمرکز دارد) تعامل می کند. بعد از رونمایی گوگل از نسخه ی honeycomb اندروید، آبجکت های Fragment هم به سیستم عامل اندروید افزوده شدند تا امکان استفاده ی مجدد و تغییر محتوا را به شکلی ساده تر و بدون نیاز به از بین بردن یا بازسازی یک Activity جدید در هر مرتبه، فراهم آورند.

در این آموزش با اکتیویتی ها و فرگمنتها در اندروید، چرخه ی زندگی آنها و این که در چه مواقعی و چگونه از آنها در اپلیکیشن های خود استفاده کنید، آشنا خواهید شد.

اکتیویتی ها

اکتیویتی ها یکی از بخش های کلیدی اکوسیستم اندروید و یکی از نخستین موضوعاتی هستند که هنگام آشنایی با توسعه ی اندروید باید با آن آشنا شوید. اکتیویتی ها به عنوان یک صفحه منفرد عمل می کنند که به کاربر نمایش داده می شود و اغلب بخش زیادی از منطق برنامه را در بر دارد.

وقتی یک کلاس اکتیویتی دارید که به صورت دستی یا با استفاده از Template های اندروید استودیو ساخته شده، لازم است که اگر قبلا به فایل AndroidManifest.xml پروژه اضافه نشده  آن را در آن جا به شکل زیر تعریف کنید:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
} 

در قطعه کد بالا متوجه یک تگ intent-filter  با یک آیتم action  و category  نیز می شوید. اگرچه توضیح و تفسیر جزئیات این آیتم ها فراتر از مقوله ی این مبحث است اما باید بدانید که این خطوط اضافه نشان می دهند که سیستم چگونه متوجه می شود وقتی کاربر اپ شما را انتخاب می کند اول باید کدام Activity  را باز کند.  

 

وقتی یک Activity  ایجاد کردید احتمالا می خواهید آنرا با یک فایل XML برای layout همراه کنید تا بتوانید به راحتی  از View Objects های layout استفاده نمایید. این کار را می توانید در متد onCreate()  انجام دهید.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

پس از فراخوانیsetContentView() می توانید کار رفرنس دادن آبجکت های View از فایل layout را شروع کنید.

 

چرخه ی حیات اکتیویتی

 

در این مرحله حتما این سوال برای شما ایجاد می شود که onCreate()  چیست و چرا از آن استفاده می کنیم. متد onCreate()  یکی از متدهای مربوط به چرخه ی حیات Activity است که وقتی اولین بار Activity ساخته می شود فراخوانی می گردد. اینجاست که می توانید بخشی از گام های آغازین خود در Activity را پیش ببرید چون به طور قطع این متد در اولین مرتبه ی ایجاد Activity در چرخه ی حیات Activity مانند تصویر زیر فراخوانی می شود: (متن زیر تصویر: منبع: وب سایت Google Developer)

منبع: وبسایت google developers

نمودار بالا ترتیب فراخوانی متدها، هنگام خارج شدن یا وارد شدن اکتیویتی به وضعیت های ممکن مختلفش را نشان می دهد:

  • onCreate: همان طور که از نامش پیداست، وقتی یک اکتیویتی ساخته می شود فراخوانی می گردد. onStart به حالت عکس آن مربوط بوده و زمانی فراخوانی می شود که اکتیویتی از حافظه ی دستگاه حذف می شود. چند نمونه ی کوچک از حالاتی که ممکن است onDestroy فراخوانی نشود نیز وجود دارد اما از حیطه ی این آموزش خارج است.

 

  • onStart: زمانی فراخوانی می شود که یک اکتیویتی برای کاربر قابل رویت می شود و onStop زمانی فراخوانی می گردد که آن اکتیویتی دیگر قابل رویت نیست. این دو مورد می توانند زمانی که یک اپ با استفاده از دکمه ی Home به بک گراند منتقل می شود و وقتی اپ دوباره روی صفحه قرار میگیرد اجرا شوند.
  • onResume و onPause به حضور اکتیویتی در روی صفحه ی نمایش مربوط می شوند. اگر یک جزء دیگر مثل یک دیالوگ یا Acitvity دیگری وارد صفحه ی نمایش شود این بخش از چرخه ی حیات فعال می شود.

یادگیری زمان فراخوانی هر یک از این متدها باعث می شود درگیری ذهنی شما و نیاز به تخصیص دادن مجدد و یا تفکیک مجدد منابع در اپلیکیشن هایتان هنگام کدنویسی تا حد زیادی کاهش یابد.

مدیریت تغییرات کانفیگ

حالا که در مورد چرخه ی حیات اکتیویتی اطلاعاتی کسب کرده اید وقت پرداختن به این موضوع است که وقتی یک اکتیویتی توسط سیستم از بین می رود و ساخته می شود چه اتفاقی می افتد. این اتفاق می تواند در چند موقعیت رخ دهد که رایج ترین آن هنگامی است که صفحه نمایش میچرخد.

 اکتیویتیپروسه ی تفکیکیِ استاندارد onStop()onPause()onDestroy() و بعد onCreate()  را به عنوان یک نمونه جدید Activity ساخته شده طی می کند.  

متد دیگری که در نمودار بالا نشان داده نشدهnSaveInstanceState() است. این متد زمانی که یک اکتیویتی از بین می رود فراخوانی می شود و امکان ذخیره کردن اطلاعات ساده در bundle را به شما می دهد. وقتیonCreate() دوباره فراخوانی می شود، می توانید آن اطلاعاتی که قبلا ذخیره کرده اید را استخراج نمایید. همین کار را با استفاده از متد onRestoreInstanceState() نیز می توان انجام داد.

Fragment ها

آبجکت های فرگمنت که در نسخه ی اندروید 3.0 (HoneyComb) معرفی شدند ابزارهای فوق العاده ای هستند که طراحی شدند تا مشکلات مختلف موجود در زمانی که تنها کلاس های اکتیویتی وجود داشتند را حل کنند. فرگمنت ها با ایجاد قابلیت نمایش بخش های مختلف رابط کاربری در یک صفحه ی بزرگ مثل صفحه نمایش تبلت و یا با نمایش یکی از آنها در هر مرتبه و مرتبط کردن آن ها با یکدیگر در دستگاه های کوچکتر، امکان سازماندهی اجزای رابط کاربری را فراهم کرده اند.

آنها همچنین قابلیت تقسیم بندی بخشی از کد به اجزای قابل مدیریت را ایجاد کرده و ما را از دردسر کار با کلاس های پیچیده و بزرگ Activity رها می کنند. یکی از با ارزش ترین ویژگی ها نیز این است که Fragment ها امکان ناوبری آسان را فراهم میکنند و راه آسانی برای ایجاد ارتباط بین بخش های مختلف یک اپلیکیشن را فراهم میکنند.

چرخه ی حیات

 کلاس Fragment نیز مثل کلاس Activity چرخه ی حیات دارد که به مدیریت فرگمنت از زمان الصاق آن به یک اکتیویتی تا زمان از بین رفتن آن کمک میکند. درک این چرخه ی حیات به شما کمک می کند تا اپ هایی بسازید که پایداری مناسبی داشته باشند و Debug کردن آنها به سادگی انجام شود.

منبع: وبسایت google developers
  • onAttach() و onDetach() زمانی که یک Fragment به یک Activity اضافه شده است و Fragment در داخل اپ قابل استفاده است  صدا زده میشوند.
  • onCreate() به عنوان یک متد آغازگر برای کلاس های Fragment فراخوانی می شود و onDestroy() معادل خاتمه دهنده ی آن است.
  • onCreateView() متدی است که به وسیله ی آن یک layout و آبجکت های View را برای Fragment نمونه سازی میکند.onDestroyView()  هم زمانی که نمودار درختی view که به Fragment مرتبط است حذف می شود فراخوانی می گردد.
  • onStart() و onStop() مشابه همتای خود در چرخه ی حیات Activity عمل میکنند. این متدها وقتی فعال می شوند که یک Fragment به ترتیب قابل رویت و غیر قابل رویت می شود.
  • onPause()  و onStart()  هم مشابه همتاهای Activity خود هستند. وقتی یک fragment قابل رویت است اما نقطه ی تمرکز آن تغییر کرده، یکی از این دو متد فراخوانی می شود.

زیرکلاس های Fragment ها

کلاس Fragment با اینکه به نوبه ی خود قدرتمند است اما اگر Extend نشده باشد نمی تواند از تمام قابلیت های خود برای تامین اهداف اپلیکیشن شما بهره ببرد. خوشبختانه گوگل، کلاس های child زیادی را برای Fragment فراهم آورده است تا به توسعه دهنده ها در ساخت اپ های عالی با سرعت بالا کمک کند.

در این بخش قصد داریم تعدادی از این child ها را معرفی کنیم تا از آنها برای ساخت کلاس های Fragment الهام بگیرید. بد نیست بدانید این Fragment های درونسازی شده در دسترس شما هستند و نیازی نیست خودتان آنها را بسازید.

ListFragment

این Fragment یک List View ی درونسازی شده، یک سری متدهای helper مثل یک Progress bar سیال (یک ویجت دایره ای چرخان برای بارگذاری) و یک Text View برای نمایش متن در زمانی که List خالی است را داراست.

MapFragment

یک Fragment مقدارناپذیر است که یک MapView برای استفاده در سرویس نقشه گوگل ایجاد می کند. به جای اینکه کدهای دشوار و پیچیده ی خود را بنویسید می توانید این Fragment را به کار گرفته و قابلیت های اولیه ی map را در اپ خود پیاده سازی کنید.

BrowseFragment و DetailsFragment

این دو کلاس Fragment، هر دو به عنوان بخشی از Leanback Support Library متعلق به Android TV در دسترس بوده و در مورد مسائل مربوط به رابط کاربری و عملکردهای اولیه برای توسعه ی اپلیکیشن برای دستگاه تلویزیون کاربرد دارند.

جمع بندی

اگرچه این آموزش فقط سطحی از چگونگی کارکرد کلاس های Activity و Fragment را پوشش داد اما باید بدانید که این موارد اجزای کلیدی ساخت فضای کاربری اپلیکیشن های شما هستند. با چرخه ی حیات Activity ها و Fragment ها آشنا شدید و با هم مروری داشتیم بر زیرکلاس های Fragment ها که می توانند شما را در ساخت اپ های شگفت انگیز کمک کنند. اگر میخواهید اطلاعات بیشتری در رابطه با اصول اولیه و ساخت گام به گام اپلیکیشن های اندروید داشته باشید میتوانید به آموزش برنامه نویسی اندروید با جاوا مراجعه کنید.

همچنان که کار با اندروید را ادامه می دهید با کلاس های مختلف Activity و Fragment که در دسترس شما هستند آشنا می شوید و بدون شک می توانید با آنها بهترین اپلیکیشن های جهان را بسازید.