Activity : آشنایی با اکتیویتی و ساختار آن

به نام خدا. ساده بخواهیم بگوییم، هر صفحه از اپلیکیشن را یک Activity می نامیم. یک اپلیکیشن را در نظر بگیرید که با باز کردن آن، صفحه مربوط به ورود توسط وارد کردن نام کاربری و رمز عبور نمایش داده می شود و پس از انجام این موارد، کاربر به صفحه بعدی که محتوای خاصی را نمایش می دهد هدایت می شود. این اَپ دو اکتیویتی را شامل شده است. یک اکتیویتی برای ساخت صفحه فرم ورود و اکتیویتی دوم برای صفحه نمایش محتوا. تعداد اکتیویتی هر اپ بسته به نیاز و سلیقه توسعه دهنده متفاوت بوده و از حداقل یک اکتیویتی تا ده ها عدد متغییر می باشد.
هر اکتیویتی به دو بخش Front-end و Back-end تقسیم می شود.قسمت Front-end به بخشی گفته می شود که کاربر با آن تعامل دارد، یعنی همان User interface یا به اختصار (UI) یا همان رابط کاربری که در اندروید همانطور که در فصل قبل معرفی کردیم، قسمت UI توسط کدهای XML و در فایلی با همین پسوند قرار می گیرند. قسمت Back-end مربوط به کدهای پشت صحنه بوده که از دید کاربر پنهان است که فایلی با پسوند java. و شامل کدهای زبان جاوا می باشد.
این دو قسمت هر اکتیویتی باید به نحوی به یکدیگر پیوند داده شوند. به عبارتی باید فایل xml را درون فایل java تعریف کنیم.
یک پروژه جدید ایجاد می کنیم تا به صورت عملی بررسی کنیم.

ایجاد پروژه جدید

مشاهده می کنید که اندروید استودیو برای پروژه جدید ما به صورت پیش فرض یک اکتیویتی ایجاد نموده که شامل activity_main.xml و MainActivity.java می باشد. البته نام این فایلها را هنگام ساخت پروژه می توانستیم تغییر بدهیم که نیازی نبود. با ساختار layout ها و بخش دیزاین در فصل گذشته آشنا شدیم. حال به بررسی بخش دستورات مربوط به اکتیویتی ها که شامل کدهای جاوا هست می پردازیم.

MainActivity.java

اگر شماره خطوط سمت چپ کدها را مشاهده نمی کنید با راست کلیک روی این ناحیه و گزینه Show line numbers این قابلیت فعال می شود :

فعال کردن شماره خطوط

خط اول نام پکیج هست که هنگام ساخت پروژه تعیین کرده ایم. خطوط ۳ و ۴ کلاس (Class) هایی هستند که به صورت پیش فرض روی این اکتیویتی ایمپورت شده اند.اگر کلاس ها در حالت پیش فرض به صورت …import نمایش داده شده، برای نمایش کامل لازم است روی علامت + سمت چپ آن کلیک کنید و یا از طریق تنظیمات اندروید استودیو تعیین کنید تا هیچگاه لیست کلاس های ایمپورت شده جمع نشود :
File > Settings > Editor > General > Code Folding

غیر فعال سازی Code folding

در اینجا علاوه بر قسمت import ، امکان فعال یا غیر فعال نمودن قابلیت جمع شدن سایر موارد را هم دسترسی دارید. توسط گزینه Show code folding outline می توان به طور کلی این قابلیت را فعال و غیر فعال نمود که به دلخواه بوده و ما فعلا به گزینه File header و Imports اکتفا می کنیم.
کلاس android.support.v7.app.AppCompatActivity مربوط به کتابخانه AppCompat می باشد. این کتابخانه توسط گوگل توسعه داده شده و پشتیبانی و بروزرسانی می شود. ورژن فعلی این کتابخانه ۷ می باشد که با نام appcompat-v7 شناخته می شود. هر چند مدت یک بروزرسانی جدید تحت عنوان Revesion نیز منتشر می شود که در زمان تهیه این فایل آموزشی ۲۴٫۲٫۱ جدیدترین نسخه می باشد.کتابخانه appcompat یکی از چندین کتابخانه موجود در پکیج Android Support Library می باشد که قبلا آن را نصب کرده اید (آموزش فصل دوم).
اطلاعات بیشتر و مشاهده آخرین نسخه منتشر شده این کتابخانه و سایر کتابخانه های موجود در Android Support Library :
https://developer.android.com/topic/libraries/support-library/features.html

برای افزودن کتابخانه ها به پروژه چند روش وجود دارد :
۱ – روش آنلاین :
در روش آنلاین به دو نحو می توان کتابخانه را به پروژه افزود :
۱ – ۱ : روش دستی :
در این روش، خط کدی که توسط توسعه دهنده کتابخانه موردنظر معرفی می شود را داخل فایل build.gradle (Module: app) درون dependencies اضافه (اگر dependencies را ندارید خودتان ایجاد کنید) و سپس Sync می کنیم (گزینه Sync Now نمایش داده شده در سمت راست و یا گزینه Sync Project with gradle files) تا کتابخانه از مخزن (سرور) دریافت و به پروژه اضافه شود. این خط کد با کلمه compile شروع می شود و در ادامه نام کتابخانه ذکر شده.به عنوان مثال اگر به لاین ۲۵ دقت کنید کد مربوط به کتابخانه appcompat را مشاهده می کنید که به صورت پیش فرض روی پروژه قرار داده شده. یا اگر این کتابخانه درون پروژه شما موجود نیست و قصد اضافه کردن آن را دارید، کافیست

compile 'com.android.support:appcompat-v7:24.2.1'

را درون dependencies اضافه و سینک کنید.

افزودن آنلاین دستی کتابخانه

افزودن آنلاین دستی کتابخانه

پس از زدن گزینه سینک، اندروید استودیو شروع به دریافت کتابخانه از مخزن می کند. در ابتدا MavenCentral مخزن کتابخانه ها بود که پس از مدتی توسط گوگل به jcenter تغییر یافت و در حال حاضر اکثر توسعه دهندگان کتابخانه ها، کتابخانه خود را بر روی این سرویس منتشر می کنند.
تذکر : در حال حاضر مخزن jcenter برای آی پی های ایران در دسترس نیست که نیاز به استفاده از ابزار تغییر آی پی دارید. اطلاعات بیشتر :
https://android-studio.ir/problems-and-questions
احتمالا این سوال برایتان بوجود آمده که کتابخانه چیست؟ کتابخانه را می توان مجموعه کدهایی دانست که در قالب یک بسته توسط شخص یا گروهی تهیه شده و در اختیار توسعه دهندگان قرار داده شده. از مزایای کتابخانه ها می توان به تسریع در توسعه اپلیکیشن اشاره کرد زیرا با وجود کتابخانه های آماده، در بسیاری از موارد توسعه دهنده نیازی به نوشتن کد موردنظر خود از پایه را ندارد و به سادگی می تواند از کتابخانه های مختلفی که در سطح اینترنت و بخصوص در http://github.com توسط توسعه دهندگان به صورت رایگان منتشر شده اند استفاده کند. علاوه بر اینکه باعث افزایش سرعت شما در توسعه اپلیکیشن می شود، از این جهت که این لایبرری به صورت عمومی منتشر شده و توسعه دهندگان زیادی از آن استفاده می کنند، مشکلات و به اصطلاح باگ های احتمالی موجود در مجموعه کدها به سرعت شناسایی و رفع می شود و در نهایت اپلیکیشن شما نیز باگ کمتری خواهد داشت. البته کتابخانه فقط در جاوا و اندروید کاربرد ندارد بلکه در همه زبانها و زمینه ها کتابخانه ها وجود دارند. به عنوان مثال در طراحی وب کتابخانه جاوا اسکریپت با نام jQuery هست که بسیار کاربردی بوده و در زمینه های مختلفی مانند اسلایدر و … استفاده می شود (توجه داشته باشید جاوا اسکریپت و جاوا دو زبان کاملا متفاوت بوده و ارتباطی به یکدیگر ندارند. جاوا اسکریپت زبان سمت کاربر است). با مطالعه منابع مختلف معرفی کتابخانه های اندروید می توان به اکثر مواردی که برای توسعه اپ خود نیاز دارید دسترسی پیدا کنید.

۱ – ۲ : روش خودکار :
در این روش روی فولدر app پروژه راست کلیک و سپس Open Module Settings را انتخاب می کنیم (و یا از کلید میانبر F4 استفاده می کنیم) :

اضافه کردن آنلاین خودکار کتابخانه

در پنجره جدید قسمت Module و گزینه app به صورت پیش فرض انتخاب شده (اگر نیست انتخاب کنید) و سپس به تب Dependencies بروید :

Dependencies

حال با کلیک روی گزینه + و انتخاب Library Dependency وارد صفحه بعدی می شویم :

Library Dependency

در کادر مربوطه نام کتابخانه را وارد می کنیم مانند :

com.android.support:appcompat-v7:24.2.1

وارد کردن نام کتابخانه

۲ – روش آفلاین :
در این روش لازم است فایل کتابخانه را که قبلا با پسوند .jar دریافت کرده اید را به پروژه اضافه کنید.برای این کار ابتدا نحوه نمایش پروژه را از Android به Project Files تغییر می دهیم :

Project Files

در کنار فولدرهای build و src باید فولدری با نام libs وجود داشته باشد که لازم است فایل کتابخانه با پسوند .jar را copy و سپس با راست کلیک روی این فولدر و گزینه Paste، آنرا به فولدر مخصوص کتابخانه های پروژه خودمان منتقل کنیم. اگر این پوشه به صورت پیش فرض وجود نداشت روی فولدر app راست کلیک و از مسیر New > Directory یک مسیر جدید با عنوان libs ایجاد می کنیم :

ساخت فولدر libs

ساخت فولدر libs

ساخت فولدر libs

مشاهده می کنیم فولدر libs مابین build و src اضافه شده است. بعد از انتقال فایل کتابخانه به این مسیر، به دو صورت می توان کتابخانه را به پروژه اضافه و از آن استفاده کرد.
در روش دستی کافیست buidl.gradle را باز نموده (بعد از انتقال فایل کتابخانه مجدد حالت نمایش ساختار پروژه را به Android سوئیچ نمایید) و مشابه حالت دستی آنلاین، توسط کدی که با compile شروع می شود، کتابخانه را به پروژه تعریف کنیم با این تفاوت که الان قصد داریم فایل را از مسیر libs فراخوانی کنیم نه مخزن آنلاین. پس به این صورت کد را به متد dependencies اضافه می کنیم :

compile files('libs/Library_file_name.jar')

واضح است که به جای Library_file_name.jar باید نام فایل کتابخانه موردنظر را جایگزین کنید مانند

compile files('libs/appcompat-v7.jar')

افزودن دستی فایل کتابخانه

اما در روش خودکار پس از انتقال فایل به مسیر libs به جای وارد کردن کد در build.gradle ، مانند روش خودکار در حالت آنلاین، از مسیر Open Module Settings > app به تب dependencies رفته و پس از کلیک روی علامت + ، توسط گزینه File Dependencies به مسیرها از جمله libs دسترسی داریم که با باز کردن فولدر libs، کتابخانه (ها) یی که قبلا به این مسیر منتقل کرده ایم نمایش داده شده که قابل انتخاب کردن هستند.
خب! برگردیم به بررسی ساختار اکتیویتی. خط چهارم کلاس android.os.Bundle ایمپورت شده که وظیفه آن، انتقال اطلاعات مابین اکتیویتی ها و ذخیره اطلاعات می باشد.
در خط ۶ کلاس اصلی اکتیویتی را داریم که به صورت پیش فرض توسط اندروید استودیو از کلاس AppCompatActivity ارث بری شده است. در واقع کلاسی که قبلا در خط ۳ ایمپورت شده بود در اینجا استفاده می شود. ایمپورت ها توسط اندروید استودیو به صورت خودکار انجام شده و نیاز به تایپ دستی آنها نیست. برای مثال اگر بخواهید کلاس MainActivity را حذف و مجدد خودتان بسازید و از AppCompatActivity ارث بری کنید، کلاس مورد نیاز به صورت خودکار ایمپورت می شود (به جز خط ۱ مابقی خطوط را پاک کردیم) :

ارث بری از AppCompatActivity

ایمپورت شدن کلاس AppCompatActivity

مشاهده می شود پس از انتخاب AppCompatActivity از لیست انتخابها، خط ۴ بلافاصله اضافه شد. اگر لیست انتخاب باز نشد و کلاس را به صورت دستی تا انتها نوشتید و یا بعد از انتخاب از لیست باز هم عمل ایمپورت انجام نشد، پیغامی نمایش داده می شود که از شما می خواهد توسط دو کلید Alt+Enter انجام ایمپورت را تایید کنید:

اضافه کردن کتابخانه

اضافه کردن کتابخانه

این کلاس می تواند به جای ارث بری از AppCompatActivity ، از کلاس Activity نیز ارث بری شود اما استفاده از AppCompatActivity توصیه شده زیرا این کتابخانه برای دیزاین مدرن با نام متریال دیزاین (Material Design) بسیار کار توسعه دهنده را ساده کرده و خروجی کار یک اپلیکیشن با طراحی مدرن و ساده و استاندارد خواهد بود.اکثر اپلیکیشن های جدید به خصوص اپ های حرفه ای و معتبر، از این سبک طراحی پیروی می کنند (به عنوان نمونه اپلیکیشن Gmail. در آموزشهای بعدی با متریال دیزاین بیشتر آشنا می شویم.)
به طور کلی هرگاه یک شیئی جدید تعریف کنیم، کتابخانه مورد نیاز آن به صورت خودکار اضافه می شود که در مباحث آینده بیشتر آشنا خواهیم شد.
در خط ۶ متد onCreate را می بینیم. در هر اکتیویتی، همه چیز از این متد شروع می شود و تقریبا بیشتر کد مورد نیاز را باید داخل این متد بنویسیم و هر کاری که مدنظرمان باشد را می توانیم داخل این متد اجرا کنیم. در مقابل این متد، پارامتری با عنوان (Bundle savedInstanceState) اضافه شده که در واقع شیئی است با نام savedInstanceState ساخته شده از کلاس Bundle که قبلا به وظیفه این کلاس اشاره ای داشتیم. در خط بعد به وسیله دستور super اعلام می کنیم قصد داریم علاوه بر خصوصیاتی که توسط ما درون متد Override شده تعریف می شود، به کلاس اصلی که از آن ارث بری شده یعنی AppCompatActivity نیز دسترسی داشته باشیم.
در خط ۱۱ متد setContentView() وظیفه نمایش محتوای اکتیویتی برای کاربر را دارد که به صورت

R.layout.activity_main

تعریف شده. کاراکتر R حرف اول لغت Resource به معنی منبع بوده که برای استفاده از عناصر و فایلها درون کد جاوا در اندروید استفاده می شود. با اضافه کردن .layout به R اعلام می کنیم که قصد نمایش یک Layout را داریم و نهایتا با افزودن نام فایل xml صفحه مدنظر که در اینجا صفحه اصلی می باشد (بدون ذکر پسوند) ، activity_main.xml را به اکتیویتی MainActivity.java متصل می کنیم :

setContentView(R.layout.activity_main);

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

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

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

MainActivity.java

متد onCreate را از قبل داریم. مابقی متد های اکتیویتی را به ترتیب زیر این متد اضافه و سپس با اجرای پروژه روی شبیه ساز، رفتار اکتیویتی را در logcat بررسی می کنیم تا به صورت عملی درک کنیم در هر زمان دقیقا در کدام مرحله از چرخه حیات قرار داریم. یادآوری می کنیم نیاز به نوشتن کامل کدها نیست و به عنوان مثال برای متد onStart تنها با نوشتن onSt لیست باز شده و با انتخاب اولین گزینه، متد به صورت کامل اضافه می شود:

اضافه کردن متد های اکتیویتی

اضافه کردن متد های اکتیویتی

مابقی را نیز به همین صورت اضافه می کنیم :

package ir.android_studio.season6;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
  
}

البته با کلید ترکیبی Alt + insert هم می توانید به متدها، Constructor ها و … دسترسی داشته باشید:

کلید alt + insert

اگر کیبورد شما کلید insert اختصاصی نداشته باشد (به عنوان مثال کلید insert لپ تاپ بنده با کلید عدد صفر ترکیب شده) احتمالا نیاز باشد alt + shift + insert را بگیرید. همانطور که در تصویر مشاهده می کنید برای دسترسی به Override Methods به صورت مستقیم از کلید Crtl + O هم می شود استفاده کرد.
برای اضافه کردن و چاپ لاگ دلخواه لازم است از دستور Log استفاده کنیم که می بایست درون هر متد این دستور را اضافه نماییم.

دستور Log

ما Log.e را انتخاب می کنیم (e مخفف error) تا لاگ های موردنظر ما با رنگ قرمز چاپ شده و متمایز باشد.در تصویر بالا مشاهده می کنید که برای لاگ یک Tag (برچسب) و یک متن پیام لازم داریم. به عنوان مثال می شود به صورت زیر کامل کرد :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.e("Activity method is " , "onCreate");
}

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

package ir.android_studio.season6;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private final String MyLog = "Activity method is ";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e(MyLog , "onCreate!");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(MyLog , "onStart!");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(MyLog , "onResume!");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(MyLog , "onPause!");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(MyLog , "onStop!");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(MyLog , "onRestart!");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(MyLog , "onDestroy!");
    }

}

استفاده از دستور لاگ به کتابخانه android.util.log نیاز داشت که با اضافه کردن اولین دستور Log، به صورت خودکار به بالای کد ایمپورت شد.
حالا پروژه را روی شبیه ساز جنی موشن Run می کنیم :

متد onResume

در پایین اندروید استودیو تب Android Monitor و قسمت logcat باز شده که در این قسمت تمامی اتفاقاتی که در جریان اجرا و کار با اپلیکیشن روی شبیه ساز Genymotion رخ می دهد را نشان می دهد. ما از دستور Log.e استفاده کرده بودیم پس انتظار می رود لاگ های مدنظرمان را با رنگ قرمز ببینیم :

logcat_onResume

سه خط قرمز رنگ که با تگ تعریف شده ما یعنی Activity method is شروع شده بود مشاهده می شود. به ترتیب متد های onCreate ، onStart و onResume لیست شده. این یعنی برای نمایش اکتیویتی این سه متد اجرا می شود و با متد onResume اکتیویتی بر روی صفحه نمایش قرار می گیرد. حالا گزینه دسترسی به اپ های در حال اجرا (مربع) را کلیک می کنیم :

متد onStop

خروجی logcat :

logcat_onStop

مشاهده می کنیم که اکتیویتی ابتدا onPause و سپس onStop شده. مجدد روی اکتیویتی کلیک میکنیم تا نمایش داده شود. خروجی :

متد onRestart

اکتیویتی ابتدا Restart شده (متد onRestart) سپس مانند مرحله اول پس از onStart و onResume روی صفحه نمایش قرار می گیرد.
در مرحله آخر از اکتیویتی خارج می شویم :

متد onDestroy

خروجی logcat :

متد onDestroy

اکتیویتی ابتدا Pause شده، سپس Stop و در نهایت با متد onDestroy اکتیویتی اصطلاحا Shut Down می شود.

دانلود فایل آموزشی با فرمت PDF
تعداد صفحات : ۲۹
حجم : ۱ مگابایت
قیمت : رایگان

سوالاتی که مشمول موارد زیر باشد تایید و پاسخ داده نخواهد شد :
۱ : جزء موارد پاسخ داده شده در مطلب "مشکلات و پرسش های رایج" باشد
۲ : سوال قبلا توسط افراد در دیدگاهها مطرح و پاسخ داده شده باشد
۳ : سوال خارج از مبحث آموزشی موجود در این صفحه باشد

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

کد امنیتی *