اولین برنامه را نوشتیم و بر روی شبیه ساز اجرا کردیم. حالا نوبت آن است که ببینیم برنامه ای که ساخته ایم از چه اجزایی تشکیل شده است.
هر برنامه اندروید، تعدادی صفحه مختلف است که کاربر می تواند بین آنها حرکت (Navigate) کند. به ساختار پروژه ای که در جلسه قبل ساخته ایم دقت کنید:
در آغاز باید توضیح دهیم که در نسخه های متأخر Android SDK وقتی یک پروژه اندروید می سازید، در واقع دو پروژه در اکلیپس ساخته می شود که یکی از آنها یک برنامه کتابخانه است. در واقع برنامه اصلی (در اینجا HelloWorld) برای اجرا نیاز به برنامه کتابخانه (در اینجا appcompat_v7) دارد. در فصل های آینده درباره این کتابخانه خاص که به برنامه اضافه می شود، توضیح خواهیم داد.
قسمت های اصلی این پروژه به شرح زیر است:
- src: این شاخه شامل کلیه کدهای برنامه است. همانطور که می دانید در برنامه های جاوا کلاس ها درون بسته (package) تعریف می شوند. در این شاخه کلیه بسته های برنامه را می بینید که با باز کردن هر کدام از آنها کلاس های داخل آنها را می توانید ببینید. در برنامه HelloWorld فقط یک کلاس است به اسم MainActivity. در قسمت های بعدی درباره Activity ها که یکی از اصلی ترین اجزای هر برنامه اندروید است، بیشتر آشنا می شوید.
- gen: هر برنامه اندروید که ساخته می شود، کلاسی دارد به نام R. این کلاس به صورت خودکار ساخته می شود و شما نباید محتوای آن را تغییر دهید زیرا با هر بار اجرای برنامه، این کلاس دوباره ساخته می شود. این کلاس در شاخه gen (مخفف generated) قرار دارد.
- assets: بعضی برنامه ها ممکن است فایل هایی داشته باشند که در داخل برنامه به آنها نیاز است. مثلاً برنامه می تواند شامل انواع فونت های مختلف باشد یا یک پایگاه داده که از قبل ساخته شده و با داده پر شده است یا تعدادی فایل HTML و جاوااسکریپت و CSS یا فایل های PDF و … این شاخه برای ذخیره این فایل ها است. این فایل ها در فایل apk برنامه (فایلی که در دستگاه های اندرویدی نصب می شود) قرار می گیرند.
- bin: نام این شاخه مخفف binary است و فایل هایی که بعد از ساخت (build) برنامه ساخته می شوند در آن قرار داده خواهند شد. یکی از این فایل ها apk برنامه است.
- libs: اگر برنامه برای کامپایل و اجرا نیاز به کتابخانه های جاوا یا C و C++ داشته باشد، فایل های jar کتابخانه را در این شاخه کپی می کنیم. به صورت پیش فرض در این شاخه یک کتابخانه به نام android-support-v4.jar قرار دارد. درباره این کتابخانه در آینده بیشتر خواهیم گفت.
- res: هر برنامه اندروید، تشکیل شده است از تعدادی صفحات که کاربر می بیند و با آنها تعامل دارد. برای طراحی رابط کاربری این صفحات، به فایل هایی از انواع مختلف نیاز داریم. مثلاً تصاویر، فایل های صوتی و تصویری، صفحات چیدمان (layout) (که ترتیب قرار گرفتن عناصر برنامه در صفحه را مشخص می کنند)، منوها، انیمیشن ها، ترجمه های مختلف برنامه برای زبان های مختلف، تنطیمات و … همه این عناصر در این شاخه قرار می گیرند.
- AndroidManifest.xml: این فایل محل تنظیم اصلی ترین اطلاعات برنامه است. هر چیزی که در اندروید ایجاد می کنیم، باید اینجا هم تعریف کنیم. مجوزهایی که برنامه نیاز دارد، اینجا تعریف می شود و …
حالا اصلی ترین اجزای برنامه HelloWorld را در اینجا معرفی می کنیم:
چیدمان activity_main.xml: این فایل شاخه res/layout قرار دارد. این فایل یک صفحه از برنامه اندرویدی HelloWorld (و در اصل تنها صفحه آن) است. اگر آن را باز کنید، این صفحه را در محیط طراحی گرافیکی اندروید به شکل زیر خواهید دید:
اگر بخواهیم کد XML این صفحه را ببینم باید از پایین صفحه سمت چپ، بر روی زبانه activity_main.xml کلیک کنیم و اگر دوباره خواستیم به محیط طراحی گرافیکی برگردیم، زبانه Graphical Layout را کلیک می کنیم:
کد XML که این صفحه را می سازد به شکل زیر است:
در چند فصل بعدی به طور کامل با نحوه ساختن چیدمان (layout) در اندروید آشنا خواهید شد.
کلاس HelloWorld: این کلاس جاوا که در شاخه src و در داخل بسته (package) اصلی برنامه (ir.smartlab.android.helloworld) قرار دارد شامل یک کلاس با چندین متد است. به کد این کلاس دقت کنید:
package ir.smartlab.android.helloworld; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
همانطور که می بینید این کلاس، کلاس Activity را توسعه داده است (یا به عبارتی از آن ارث برده است). Activity یکی از اصلی ترین اجزای برنامه نویسی اندروید است. هر صفحه ای که در برنامه های اندرویدی می بینید، در اصل یک Activity است. کد و برنامه آن در یک فایل جاوا و چیدمان آن در یک فایل xml قرار دارد.
از میان متدهای این کلاس، مهم ترین متد، onCreate است:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
خط دوم این متد را ببینید. این خط قلب اصلی این کلاس است. این خط، این Activity را به چیدمانی که قبلاً ساخته شده است مرتبط می کند. یعنی می گوید طرحی که این صفحه قرار است به کاربر نمایش دهد در فایلی به نام activity_main که در شاخه layout در منابع (res) قرار دارد. اینجا اولین کاربرد کلاس R که پیشتر درباره اش گفتیم را می بینید.
AndroidManifest.xml: اگر این فایل را باز کنید، صفحه طراحی مخصوص این فایل را می بینید:
احتمالاً بعد از دیدن این همه تنظیمات ممکن است ترسیده باشید! البته واقعاً نکات زیادی درباره این فایل و تنطیمات یک برنامه اندروید وجود دارد. ولی آنچه فعلاً برای ما مهم است، چند مورد بیشتر نیست. زبانه AndroidManifest.xml را باز کنید تا سری به کد XML این فایل بیاندازیم:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ir.smartlab.android.helloworld" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
در واقع این فایل شامل همه تنظیماتی است که در ویزارد ایجاد یک پروژه اندروید در فصل قبل انجام دادیم. حال به ترتیب از بالا به پایین مهم ترین نکات این تنطیمات را تشریح می کنیم.
۱- package برنامه:
package="ir.smartlab.android.helloworld"
هر برنامه اندروید باید به صورت یکتا توسط اندروید شناسایی شود. این شناسه منحصر به قرد اسم بسته اصلی برنامه است. در ویزارد ایجاد یک پروژه جدید در فصل قبل در اولین دیدید که در همان اولین قسمت ویزارد، نام بسته برنامه از شما خواسته می شود. همانطور که در «آموزش جاوا، فصل دهم: کلاس ها در برنامه نویسی شیءگرا» گفتیم، شیوه ساختن بسته برای یک برنامه جاوا (وبالتبع برنامه اندروید) استفاده از نام دامنه متعلق به نویسنده در ابتدای نام بسته است:
«برای نامگداری بسته ها از وارونه نام دامنه (Domain) شرکت استفاده کنید. مثلاً اگر در شرکت The Best Software Company کار می کنید و نام دامنه شرکت شماwww.company.com است، بسته های خود را با com.company آغاز کنید. به دلیل این که نام دامنه ها در جهان یکتا هستند، نامگذاری بسته های شما و در نتیجه کلاس های شما نیز یکتا خواهد بود.»
حالا برای اندروید، یک قسمت دیگر هم باید به نام بسته اضافه کنیم: نام برنامه. برای برنامه HelloWorld نام دامنه را به این شکل تعریف می کنیم: ir.smartlab.android.helloworld. این نام بسته کاملاً منحصر به فرد است زیرا دامنه منحصر به فرد است و اگر نام برنامه را هم منحصر به فرد انتخاب کنیم، نام بسته که به عنوان شناسه برنامه ها در اندروید به کار می رود نیز همیشه یکتا خواهد بود.
احتمالاً برایتان سؤال پیش آمده که اگر نام بسته یکتا نباشد چه اتفاقی می افتد؟ خیلی ساده است؛ اندروید اجازه نصب دو برنامه با نام بسته یکسان در یک دستگاه را نمی دهد! البته بازارهای برنامه های اندروید مثل Google Play و کافه بازار هم اجازه انتشار دو برنامه با نام بسته یکسان را نمی دهند. پس در انتخاب نام بسته دقت کنید.
۲- versionCode و versionName برنامه:
android:versionCode="1" android:versionName="1.0"
هر برنامه اندروید ممکن است بارها و بارها منتشر شود. برخی از این انتشارها به علت رفع خطاهای موجود در برنامه ها و برخی به علت افزودن ویژگی های جدید به برنامه ها است. وقتی یک برنامه قرار است مجدداً منتشر شود، هم خود برنامه باید بداند از چه نسخه ای به چه نسخه ای قرار است ارتقا پیدا کند، هم دستگاه اندرویدی که این برنامه بر روی آن نصب است باید نسخه برنامه را بداند و البته بازارهای برنامه (Google Play و کافه بازار). بنابراین شما باید به نوعی نسخه برنامه را درون خود برنامه قرار دهید. برای این کار دو ویژگی versionCode و versionName در مانیفست تعریف می شوند. versionCode یک عدد است که در هر بار ارتقای برنامه، باید عددی بزرگتر از عدد قبلی باشد و فقط اعداد صحیح را می توانیم به عنوان versionCode معرفی کنیم. مثلاً از نسخه ۱ برنامه را به نسخه ۲ ارتقا می دهیم. ویژگی versionCode را بازارها و دستگاه می خوانند ولی به کاربران نشان داده نمی شود زیرا غالباً سیستم ورژن گذاری برنامه ها در شرکت ها متفاوت است. خیلی از شرکت ها بین ارتقایی که فقط خطاها را رفع می کند و ارتقایی که ویژگی های جدید به نرم افزار اضافه می کند فرق می گذارند. versionName هر عبارت متنی را می پذیرد و برای مثال می توانید در ارتقا از نسخه ۱ به ۲، versionName را از ۱٫۰٫۰ به ۱٫۰٫۱ تغییر دهید. versionCode را بازارها و دستگاه های اندروید به کاربر نمایش می دهند.
۳- minSdkVersion:
android:minSdkVersion="8"
ابتدا لازم است فرق بین SDK version و Android version را بدانید. اندروید یک سیستم عامل است و به صورت مستقل در حال تکامل است. ابزارهای برنامه نویسی آن (که با نام Android SDK) شناخته می شود، پروژه مستقل دیگری است. معمولاً با هر عرضه جدید از سیستم عامل اندروید، نسخه جدیدی از Android SDK هم منتشر می شود. ولی ممکن است عرضه جدید اندروید منحصر به رفع خطاهای اندروید باشد و ویژگی جدیدی به آن اضافه نشود. بنابراین Android SDK بدون تغییر بماند. یا بر عکس، Android SDK بروزرسانی شود بدون این که نسخه جدیدی از سیستم عامل اندروید منتشر شود. به همین دلیل سیستم عامل اندروید نسخه های خودش را دارد و Android SDK نسخه های خودش را. نسخه های اندروید مثلاً ۴٫۴ است که با نام تجاری KitKat در بازار شناخته می شود. نسخه های Android SDK به صورت عددی هستند و نام تجاری ندارند. نسخه های Android SDK اصطلاحاً API Level نامیده می شوند و به صورت عددی هستند. برای مثال همراه با اندروید KitKat نسخه ای از Android SDK منتشر شد که API Level 19 نامیده می شود. در برنامه نویسی اندروید آن چیزی که مهم است نسخه Android SDK یا همان API Level است.
minSdkVersion شماره پایین ترین API Level ی است که برنامه شما پشتیبانی می کند و بر روی دستگاه هایی که API Level آنها کمتر از مقدار minSdkVersion باشد، برنامه شما نصب نخواهد شد. در هنگام ایجاد یک پروژه اندروید (رجوع کنید به فصل قبل) minSdkVersion در همان اولین مرحله ویزارد تحت عنوان Minimum Required SDK از شما پرسیده می شود ولی اینجا هم می توانید آن را تغییر دهید.
فرض کنید minSdkVersion را ۸ انتخاب کنید. معنی این انتخاب این است که برنامه شما بر روی دستگاه هایی که API Level آنها کمتر از ۸ است اجرا نخواهد شد. اگر به جدول زیر دقت کنید می بینید که API Level اندروید Froyo (نسخه ۲٫۲) ۸ است. بنابراین برنامه شما بر روی اندرویدهای ۲٫۱ و ماقبل اجرا نخواهد شد.
نکته ای که توجه به آن ضروری است این است که اینجا باید همیشه بین انتخاب یک نسخه از API Level که بیشترین دستگاه های موجود در بازار آن را پشتیبانی می کنند و امکانات آن ها صورت گیرد. برای مثال اگر می خواهید از امکانات Download Manager اندروید در برنامه های خود بهره بگیرید، می بینید که این ویژگی در API Level 9 معرفی شده است و اگر minSdkVersion خود را ۸ انتخاب کنید نمی توانید از آن استفاده کنید. اگر minSdkVersion را ۹ انتخاب کنید، در عوض چند درصدی از گوشی های موجود در بازار دیگر نمی توانند برنامه شما را اجرا کنند. توصیه گوگل این است که سعی کنید ۹۵ درصد دستگاه های موجود در بازار را پشتیبانی کنید. بنابراین minSdkVersion خود را نسخه ای انتخاب کنید که تعداد دستگاه هایی که API Level آن ها کمتر از مقدار فوق است، کمتر ار ۵ درصد دستگاه های موجود در بازار باشند.
حال احتمالاً می پرسید از کجا بدانیم درصد استفاده از هر API Level در گوشی ها چقدر است؟ پرسش به جایی است. گوگل به صورت منظم اطلاعاتی را منتشر می کند که درصد استفاده از نسخه های مختلف اندروید را به همراه انبوهی از اطلاعات مفید دیگر منتشر می کند. برای دسترسی به این اطلاعات بخش Dashboard در سایت توسعه دهندگان اندروید بروید:
این آخرین اطلاعاتی است که در زمان نگارش متن منتشر شده و مربوط به حدود ۳ هفته قبل است. همانطور که می بینید برای این که شرط ۹۵ درصد محقق شود، می توانید minSdkVersion را ۱۰ تعریف کنید.
(خیلی طولانی شد! ولی لازم بود!)
۴- targetSdkVersion:
android:targetSdkVersion="21"
targetSdkVersion را همواره بالاترین نسخه API Levelی که منتشر شده و شما هم دانلود کرده این قرار بدهید. در حال حاضر این مقدار احتمالاً ۱۹ (مربوط به KitKat) یا ۲۱ (مربوط به پیش نمایش Android L) است. کاربرد آن را در آینده خواهید دید.
۵- تگ Application:
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > </application>
در این تگ اطلاعات کلی درباره نام برنامه، آیکون برنامه، تم (زمینه) برنامه و … و نیز کلیه Activityها، Serviceها و BroadcastReceiver ها تعریف می شوند. (عجله نکنید! در انتهای این دوره آموزشی به همه اینها آشنا می شوید!)
۵-۱- android:allowBackup: اگر مقدار این ویژگی true باشد، برنامه های بکاپ گیری می توانند اطلاعات محرمانه برنامه را بخوانند و آن ها را ذخیره کنند. در صورت که false باشد، برنامه های بکاپ گیری نمی توانند از برنامه شما بکاپ تهیه کنند. انتخاب با شما است.
۵-۲- android:icon: آیکون برنامه شما را مشخص می کند. در فصل های آتی مفصل درباره موضوع تصاویر و عکس ها و آیکون ها در اندروید خواهیم گفت.
۵-۳- android:label: عنوان یا نام برنامه در دستگاه را مشخص می کند. در فصل های آتی مفصل درباره پشتیبانی همزمان از چند زبان در اندروید خواهیم گفت.
۵-۴- android:theme: اندروید از نسخه ۴ به بعد از تم پشتیبانی می کند و ۲ تم Holo Light و Holo Dark دارد. می توانید از یکی از این ۲ تم استفاده کنید یا آن ها را بسته به نیاز خود تغییر دهید یا اگر وقت و سلیقه و توانایی کار با ابزارهای گرافیکی و البته دانش اندروید دارید یک تم جدید بسازید. App Theme که اینجا به عنوان تم برنامه معرفی شده است، تمی است که از تم Holo مشتق شده است و می توانید آن را تغییر دهید تا بر نیازهای شما منطبق شود. در فصل های خیلی دور (!) درباره تم خواهیم گفت. فعلاً کارهای خیلی مهم تری از تم نوشتن داریم!
۶- تگ Activity:
<activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
همانطور که گفتیم در داخل تگ Application باید همه Activity ها را تعریف کرد. برنامه ما فعلاً یک صفحه بیشتر ندارد و در نتیجه یک Activity هم بیشتر ندارد. این تگ خود چندین ویژگی دارد:
۶-۱- android:name: نام کلاس جاوای مرتبط با این Activity است. نام کلاس را یا باید کامل و به همراه بسته (package) بنویسید مثل ir.smartlab.android.helloworld.MainActivity یا آن را خلاصه کنید. برای خلاصه کردن می توانید نام package برنامه را از آن حذف کنید: MainActivity.
۶-۲- android:label: نامی است که برای این Activity انتخاب کرده اید. این نام در چندین جا ظاهر می شود که مهم ترین آن در بالای صفحه برنامه و در نواری که اصطلاحاً ActionBar نامیده می شود (قسمتی که با رنگ زرد مشخص شده است):
در فصل بعد کمی برنامه HelloWorld را تغییر می دهیم. نظر شما چیست؟ چیزی از قلم نیافتاده؟ نظرات شما در بهبود این مطالب بسیار راهگشا خواهد بود!
سلام
ببخشید من یه مشکلی دارم
وقتی برنامه رو RUN میکنم، به جای اجرای برنامه اندروید، پروژه ی جاوایی که قبلا در اکلیپسم اجرا شده اجرا میشه
میشه لطف کنید بگید باید چیکار کنم؟اینجوری نمیتونم پیش برم
ممنون
دکمه سبز رنگ Run یا اجرا در اکلیپس همیشه آخرین برنامه اجرا شده را اجرا میکند. بنابراین یک بار برنامه را با استفاده از منوی Run اجرا کنید و در دفعات بعدی از دکمه Run استفاده کنید. در ضمن در کنار دکمه Run فلش سیاه کوچکی است که اگر آن را بزنید همه برنامههای اجرا شده قبلی را فهرست کرده که میتوانید از میان آنها برنامه مورد نظر خودتان را انتخاب کنید.
دقیقا مشکلم اینه که وقتی اون فلش مشکی رو میزنم لیست همه برنامه های جاوایی که قبلا نوشتم رو میاره و خبری از برنامه hello woeld اندرویدم نیست…
واقعا باید چکار کنم؟؟؟
یکی از فایلهای جاوای برنامه را باز کنید و بعد وقتی که تب کلاس جاوا فعاله دکمه سبز رنگ Run رو بزنید. ازتون میپرسه که چطور برنامه رو اجرا کنه که یکی از گزینههاش Android Application است و بعد از اون برنامه رو در لیست برنامههای قابل اجرا میاره براتون.
سلام. دست تون درد نکنه
من یه مشکلی دارم دو برنامه ساختم که همه اسم ها … اسم بسته و پکیج و … متفاوته
اما خب ساختار یکیه و فقط محتواها و اسم ها فرق دارند
اما وقتی دو برنامه رو می ریزم رو گوشی روی هر کدوم که کلیک می کنی تا باز بشه پنجره ای باز می شه که کدوم رو برنامه می خوام باز کنم.
ممنون از وقتی که می ذارید
سلام. احتمالا در فایل مانیفست هر دو برنامه یک اکتیویتی با intent-filter های مشابه دارید.
سلام….خدا خیرتون بده…توضیحات جامع و کافی بودند….ممنونم
سلام
من وقتی میخوام new project بسازم کلاس R ایجاد نمیشه
یعنی پروژه Helloworld میاد appcompat-v7 هم میاد ولی کلاس R ایجاد نمیشه
و خطا میده لطفا راهنمایی کنید
آقا عالی بود مرسی کامل توضیح دادید .
سلام
در مورد ست کردن network security (امنیت شبکه) تو مانیفست / جهت اجرای خروجی های apk در اندروید ۹ / یا / اندروید های بالا / راهنمایی می خواستم /
ممنون
سلام
محمدی هستم
سایتتون رو بررسی کردم
محتواهای خوبی نوشتین
سایتتون سرعت مناسبی داره
من هم مثل شما سایت هام رو با وردپرس می سازم
وردپرس واقعا محشره و خیلی زود با وردپرس میشه اومد تو صفحه اول گوگل
یک موردی که من تو سایت شما دیدم اینه که تعداد بک لینک هاتون خیلی کمه
برای همین هم هست که تو تعداد زیادی کلمه کلیدی مهم تو صفحه اول گوگل نیستید
راستی یادم رفت بگم ، من متخصص سئو هستم
اگه یه مقدار در مورد بک لینک سازی فعالیت کنید ، مطمئنا نتیجه های فوق العاده ای می گیرید
یه سایت هست بک لینک رایگان و پر قدرت رو برای مدت محدود برای دانلود قرار داده
یه رپرتاژ خبری هم به ارزش ۴۰۰ هزار تومان داره رایگان میده
پیشنهاد می کنم حتما دانلود کنید مختص سایت های وردپرسی مثل شماست
تا هنوز بر نداشتن ، برید دانلود کنین
لینک دانلود اگه اشتباه نکنم این بود
[…]