آموزش برنامه نویسی اندروید با اندروید استودیو (بخش دهم: مثالی از چرخه حیات یک Activity)

استاندارد

همان طور که در بخش هشتم گفته شد، چرخه حیات یک Activity شامل هفت حالت است. که عبارت اند از:

onCreate(), onStart(), onResume(), OnPause(), onStop(),onRestart(), onDestroy().

چرخه حیات این هفت حالت را بار دیگر در تصویر زیر نیز می توانید مشاهده نمایید.

android-activity-lifecycle-gsm-developers

حال می خواهیم با ارائه مثالی عملی، این چرخه حیات را به شما نشان دهیم.

برای این کار، در اکتیویتی اصلی، یک برنامه می نویسیم که توابع موجود در 7 حالت چرخه حیات Activity، را با یک یادداشت (log) به صورت خروجی به ما نشان دهد.

به عنوان مثال فرض کنید که تابعی بدین صورت برای حالت ()onStart ایجاد می کنیم. وقتی Activity برنامه ی ما در این حالت باشد، با یک یادداشت این موضوع را به ما نشان خواهد داد.

protected void onStart() {
        super.onStart();
        Log.i(My_TAG,"onStart");
    }

اگر در مورد کد بالا و نحوه ی ایجاد حالت ()onStart، برایتان سوال پیش آمده است، باید بگویم نحوه ی ایجاد حالت های چرخه حیات Activity، در بخش هشتم آموزش داده شد. ولی نگران نباشید، این ها همان کدهایی که در بخش هشتم هستند، می باشند ولی به صورتی ساده تر! در واقع برای نوشتن تابع وضعیت چرخه حیات، تنها کافی است کدی به صورت ()Super.Unknown را (به جای Unknown می توانید وضعیت چرخه حیات را بنویسید) در در تابعی مربوط به همان وضعیت بنویسیم. (همانند مثال بالا)

حال کدهای زیر را در فایل جاوای اصلی برنامه (MainActivity) که در پوشه ی Java می باشد، مانند عکس کپی می کنیم.

android-studio-beginners-gsm-developers-16

@Override
    protected void onStart() {
        super.onStart();
        Log.i(My_TAG,"onStart");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(My_TAG,"onPause");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(My_TAG,"onResume");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(My_TAG,"onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(My_TAG,"onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(My_TAG,"onRestart");
    }

برای نشان دادن یادداشت (Log)، باید کتابخانه ی مخصوص این کار را به برنامه اضافه کنیم.

برای اضافه کردن کتابخانه مورد نظر از کد زیر استفاده نمایید.

import android.util.Log;

کسانی که نمی دانند این کتابخانه را چطور به برنامه اضافه کنند، عکس زیر را مشاهده نمایند.

android-studio-beginners-gsm-developers-17

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

برای نوشتن این پیام ابتدا خط زیر را به برنامه و بالای تابع ()onCreate اضافه کنید. در این صورت با چاپ خروجی، نوشته ی ما هم نشان داده می شود.

private  static final  String My_TAG = "Gsm_Learning_Message:";

برنامه ی ما آماده ی اجراست. از تب Run، قسمت Run app را انتخاب می کنیم.

android-studio-beginners-gsm-developers-18

در قسمت بعدی از ما دستگاه اندرویدی شبیه ساز خواسته می شود که ما نکسوس 5 را قبلا برای این کار انتخاب کرده ایم.

android-studio-beginners-gsm-developers-19

پس از آن که دستگاه شبیه ساز (در اینجا نکسوس 5)، برنامه نوشته شده ی ما را اجرا کرد باید از قسمت Logcat ، یادداشت ها (logهایی) که نوشته بودیم نشان داده شود. این موضوع نشان دهنده ی اینست که در هر لحظه، اکتیویتی ما در کدام چرخه حیات خود می باشد. برای آوردن LogCat می توانید از کلید های ترکیبی 6 + Alt استفاده نمایید.

android-studio-beginners-gsm-developers-21

خب برنامه اجرا می شود و ما در قسمت Logcat تغییراتی شبیه به زیر را مشاهده می کنیم.

مشاهده می کنید که وقتی برنامه اجرا می شود، اکتیویتی ما به حالت onStart و سپس onResume می رود.

android-studio-beginners-gsm-developers-22

با زدن دکمه Home، از برنامه خارج می شویم و سپس در قسمت Logcat تغییرات زیر را مشاهده می کنیم.

android-studio-beginners-gsm-developers-23

همان طور که انتظار می رفت، Activity ما به حالت های onPause و onStop می رود.

با باز کردن و بستن برنامه می توانید حالت های چرخه حیات اکتیویتی را مشاهده نمایید.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش هشتم:آشنایی با چرخه حیات Activity در برنامه نویسی اندروید)

استاندارد

در بخش قبلی در مورد اکتیویتی صحبت کردیم. در آخر آن بخش شما در فایل Xml یک اکتیویتی اصلی را مشاهده نمودید.

در این بخش در مورد این اکتیویتی ها صحبت بیشتری خواهد شد و چرخه حیات Activity به صورت کامل برای شما توضیح داده می شود.

چرخه حیات اکتیوینی دقیقا چیست؟

در اپلیکیشن هایی که طراحی خواهیم کرد و یا اپلیکیشن های حاضر در دستگاه اندرویدی شما، هر اپلیکیشن از چندین اکتیویتی تشکیل شده است.

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

فرض کنید دو نوع اکتیویتی داریم. اکتیویتی A و اکتیویتی B.

از اکتیویتی A به اکتیویتی B می رویم. سوالی که پیش می آید اینست که چه بلایی بر سر اکتیویتی A می آید؟ آیا بسته می شود؟ آیا هنوز در حال اجراست؟

اگر اکتیویتی B منابع کمی مصرف نماید، چه می شود؟ اگر منابع زیادی مصرف نماید چه؟ اگر زمان اکتیویتی B خیلی طول بکشد چه می شود؟ اگر کم طول بکشد چه می شود؟

سوال های متعددی ممکن است در این باره پیش آید.

این سوالات همگی به یک چیز می رسند! چرخه حیات

پس آشنایی و مدیریت چرخه حیات می تواند به بهتر شدن اپلیکیشن اندرویدی مان کمک بسیار شایانی نماید.

مدیریت چرخه حیات Activity

هفت حالت برای مدیریت چرخه حیات وجود دارد. این هفت حالت عبارت اند از:

()onCreate (ایجاد):

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

()onStart (شروع):

این فراخوانی هنگامی که اکتیویتی برای کاربر، نمایان می شود انجام می شود.

()onResume (ادامه):

این فراخوانی وقتی که کاربر دوباره شروع به تعامل با اپلیکیشن می کند، انجام می شود.

()onPause (مکث):

وفتی این فراخوانی انجام می شود، اکتیویتی نمی تواند به داده های ورودی کاربر جواب دهد و یا کدی را اجرا نماید. این فراخوانی وقتی انجام میشود که فعالیت دیگری، آغاز می شود و فعالیت فعلی به مرحله مکث می رود.

()onStop (توقف):

این فراخوانی وقتی انجام می شود که اکتیویتی دیگر فعال و یا نمایان نیست.

()onDestroy (نابود شدن):

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

()onRestart (راه اندازی مجدد):

این فراخوانی هنگامی اجرا می شود که اکتیویتی که قبلا متوقف (Stop) شده بود، بخواهد دوباره راه اندازی شود.

در بخش قبل مشاهده کردید که وقتی پروژه را شروع کردیم یک فعالیت (activity) اصلی به صورت اتوماتیک ایجاد شد.

android-beginners-10-gsm-developers

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

 

android-beginners-9-gsm-developers

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

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

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

android-activity-lifecycle-gsm-developers

دوستانی که در دانشگاه درس سیستم های عامل را خوانده اند اگر به یاد داشته باشند، هر فرایند چندین مرحله از زمان ایجاد تا پایان داشت. در اینجا نیز اتفاقی مشابه رخ می دهد.
سعی می کنیم تصویر بالا را با یک مثال برای شما توضیح دهیم.
فرض می کنیم که یک اپلیکیشن داریم با دو Activity به نام های A و B. مثال را با اکتیویتی A جلو می بریم.
زمانی که کاربر برای اولین بار اکتیویتی A را ایجاد نماید (این اتفاق فقط در پشت صحنه می افتد و کاربر خودش ممکن است اصلا از اکتیویتی خبر نداشته باشد)، مرحله ()onCreate یعنی ایجاد شدن اکتیویتی، فراخوانی می شود.
سپس اکتیویتی شروع می شود. پس متد ()onStart نیز فراخوانی می شود. حال باید اکتیویتی ادامه داشته باشد پس متد ()onResume فراخوانی می شود.
این مرحله به همین صورت در این قسمت می ماند(تمام نشده است). حال اکتیویتی B می خواهد اجرا شود. ابتدا اکتیویتی A باید منتظر بماند تا مراحل اکتیویتی B اجرا شود پس به مرحله ()onPause می رود. و اکتیویتی B به همان صورت اجرا می شود.
اگر برای زمانی طولانی به اکتیویتی A برنگردیم، اکتیویتی A، متد ()onStop را فراخوانی می کند و متوقف می شود.
اگر حافظه ی کافی برای اکتیویتی A وجود نداشته باشد، متد ()onDestroy فراخوانی می شود.

ایجاد اکتیویتی به دو صورت خودکار و دستی

سوالی که پیش می آید اینست که ما چگونه یک Activity را در کدهایمان ایجاد نماییم.
ابتدا به فایل MainActivity.java در اندروید استادیو می رویم.
قبلا مشاهده کردید که درون کلاس اصلی جاوا، یک اکتیویتی اصلی به صورت خودکار ایجاد شده بود.
حال برای ایجاد یک اکتیویتی دیگر، وقتی هنوز در کلاس اصلی جاوا و خارج از اکتیویتی اصلی هستیم، کلید های ترکیبی Ctrl + O را فشار می دهیم.

android-beginners-13-gsm-developers

با زدن کلیدهای ترکیبی بالا، پنجره زیر نمایان می شود که می توانید اکتیویتی خود را انتخاب نمایید.

android-beginners-14-gsm-developers

:می توانید اکتیویتی ها را به صورت دستی نیز ایجاد نمایید که باید از کدهای زیر استفاده کنید. کدهای زیر مربوط به 7متد اکتیویتی می باشد

package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;

public class MainActivity extends Activity {
   String msg = "Android : ";
   
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }

   /** Called when the activity is about to become visible. */
   @Override
   protected void onStart() {
      super.onStart();
      Log.d(msg, "The onStart() event");
   }

   /** Called when the activity has become visible. */
   @Override
   protected void onResume() {
      super.onResume();
      Log.d(msg, "The onResume() event");
   }

   /** Called when another activity is taking focus. */
   @Override
   protected void onPause() {
      super.onPause();
      Log.d(msg, "The onPause() event");
   }

   /** Called when the activity is no longer visible. */
   @Override
   protected void onStop() {
      super.onStop();
      Log.d(msg, "The onStop() event");
   }

   /** Called just before the activity is destroyed. */
   @Override
   public void onDestroy() {
      super.onDestroy();
      Log.d(msg, "The onDestroy() event");
   }
}

ممکن است کمی این مبحث، گیج کننده به نظر برسد ولی نگران نباشید. در بخش های بعدی بیشتر با این اکتیویتی ها برخورد خواهیم کرد و به صورتی کاربردی آن ها را یاد خواهیم گرفت.