0
توجه: بعلت محدودیتهای صفحات وب، برخی از ویژگی‌های این کتاب، مانند فرمول‌ها و جداول، بصورت صحیح در مرورگرهای اینترنتی نمایش داده نمی‌شوند. برای مشاهده دقیق این موارد باید فایل PDF را مطالعه فرمایید. در ضمن، این فایل کامل نیست و تنها شامل گزیده‌هایی از متن کتاب است. متن اصلی حدود 300 صفحه، و به فرمت pdf است و فرمت‌بندی صفحات و فانت‌ها در آن حفظ شده و به راحتی روی دستگاه‌های موبایل قابل خواندن است. برای دریافت فایل کامل به این آدرس مراجعه کنید. برای مشاهده فهرست محتویات کامل کتاب به این آدرس مراجعه کنید.

نقل مطالب این سایت در رسانه‌های اینترنتی یا چاپی فقط با ذکر آدرس منبع مجاز است.
برای تنظیم بزرگنمایی حروف از دکمه‌های زیر استفاده کنید.
            


خلاصه‌ای از بخش‌های کتاب

خودآموز سریع برنامه‌نویسی اندروید

تالیف اُنر چنار (Onur Çınar)

Android Quick APIs Reference

 

 

ترجمه کامران بزرگزاد ایمانی



 

مقدمه مترجم

اندروید سیستم عاملی است که در همه جا دیده می‌شود، از تلفن‌های موبایل و تبلت‌ها گرفته تا تلویزیون‌ها، SetupBoxها، و اخیراً در دستگاه‌های پوشیدنی. شیوع این سیستم در جهان بیش از هر سیستم مشابه‌ای است و برنامه نویسان زیادی برای آن برنامه تولید می‌کنند. از زمان انتشار این کتاب، حدود 8 سال از ظهور اندروید می‌گذرد و در طی این مدت 5 نسخه عمده از این سیستم عامل توسط کمپانی گوگل منتشر شده است.

با توجه به جدید بودن این سیستم عامل، و کلاً جدید بودن حوزه نرم‌افزار موبایل، اندروید مفاهیم جدیدی را نیز با خود به همراه آورده. این مفاهیم برای برنامه‌نویسان سنتی تا اندازه زیادی ناآشنا و گنگ بنظر می‌رسد. اصطلاحاتی از قبیل Activity, View, Intent, Drawable ، ... و غیره.  درواقع بسیاری از این اصطلاحات و مفاهیم جدید نیستند و بخاطر رقابت‌هایی که کمپانی‌های مختلف با یکدیگر دارند، در قالب جدیدی نسبت به قبل عرضه شده‌اند و فقط اسم آنها عوض شده. ولی در برخی از موارد نیز مفاهیم جدیدی ارائه شده که مختصِ تکنولوژی‌های موبایل هستند. به چند دلیل معادل‌یابی دقیق برای این اصطلاحات مشکل است، که من در اینجا به چند نمونه از آنها اشاره می‌کنم:

-      این اصطلاحات معنی دقیقی ندارند، حتی در زبان اصلی. مسلم است که برای هر چیز جدیدی باید نام و اصطلاحی را ابداع کرد. ولی متاسفانه اکثر اصطلاحاتی که در سالهای اخیر توسط کارشناسان نرم‌افزار ارائه شده‌اند في‌البديهه ساخته می‌شوند و خیلی به معانی عمقی، و حتی سطحی آنها، توجه نمی‌شود. به معنای ظاهری اینگونه اصطلاحات نباید توجه‌ای نشان داد و برای درک آنها باید توضیحات مربوطه را مطالعه کرد.

-      برای اینگونه اصطلاحات ترجمه‌هایی در زبان فارسی موجودند ولی معنی درست و روشنی ندارند. در بسیاری از کتابهای علوم رایانه‌ای که به زبان فارسی ترجمه شده‌، از لغاتی استفاده می‌شود که از قبل موجود بوده‌اند، ولی متاسفانه این لغاتِ فارسی نیز معنی روشنی ندارد و ممکن است فقط معادلی باشد برای یکی از معانی لغت اصلی، معنی که هیچ ربطی به زمینه فعلی ندارد. بکارگیری این لغات در ترجمه نیز نامفهوم و گمراه کننده است.

با توجه به اینکه کارشناسان نرم‌افزار همه روزه در کار خود با لغات انگلیسی سر و کار دارند و علي‌الاصول در کاربرد این لغات مشکلی ندارند، رویکرد ما در ترجمه این بوده که بجای کاربرد برخی لغاتِ نامانوسِ فارسی، از لغت اصلی استفاده شده تا سوء برداشتی از این اصطلاحات نشود. همچنین بدلیل ناخوانا بودن املاء فارسی مخفف‌هایی نظیر API، SDK، و یا UI (یعنی ا‌ِپی‌‌آی، اس‌‌دی‌‌ک، یوآی)، آنها نیز بصورت لاتین ذکر شده‌اند و هرجا هم که لازم بوده بصورت ترکیب فارسی جمع بسته شده‌اند، مانند ”APIها“.

درباره کتاب

کتابهای زیادی برای آموزش برنامه‌نویسی اندروید موجود است که حجم اغلب  آنها بین 500 تا 1500 صفحه است. محتوای اکثر این کتابها را لیست‌های طولانی مربوط به پروژه‌ها تشکیل می‌دهند. مطالعه کتابهای مفصل برای بیشتر افراد خسته کننده است و خیلی وقت‌ها خواندن آنها ناتمام می‌ماند. ولی در این کتاب توسعه برنامه‌های اندرویدی با مثالهایی ساده و کوتاه توضیح داده می‌شود. مزیت این کتاب در این است که علاوه بر سادگی و پوشش دادن اکثر مباحث اصلی مربوط به برنامه نویسی اندروید، حجم آن نیز نسبت به کتابهای مشابه کمتر است و خواننده بدون آنکه از ناتمام ماندن آن نگرانی داشته باشد، می‌تواند آن را در مدت کوتاهی مطالعه کند.

درباره نویسنده

اُنُر چنار (Onur Cinar) مهندس نرم‌افزار تُرک تباری است که فعلاً بعنوان مدیر توسعه در بخش Skype مایکروسافت درگیر پروژه‌هایی نظیر Skype Qik،  GroupMe، و  Skype for Android میباشد. وی در زمینه‌ طراحی، توسعه و مدیریت پروژه‌های بزرگ و پیچیده دارای 19 سال سابقه کار است. از کتابهای دیگر وی میتوان از ”Android Apps with Eclipse“ و ”Pro Android C++ with the NDK“ را نام برد.

کامران بزرگزاد

تابستان 1394

  

مقدمه مؤلف

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

کتاب ”خودآموز سریع برنامه نویسی اندروید“ شامل مثال‌هایی کوتاه، و نیز مرجع مختصری برای API سیستم عامل اندروید است. این کتاب همچنین APIهایی را دربر می‌گیرد که در آخرین نسخه اندروید، یعنی نسخه 5.0 (یا آبنبات‌ چوبی)، معرفی شده‌اند. در این کتاب APIهای اندروید طوری سازماندهی شده‌اند که بتوان از آنها بعنوان یک مرجع راهنمای ساده استفاده کرد.

به منظور اینکه بتوانید مطالب مربوط به APIها را با عمق بیشتری مطالعه کنید، در این کتاب بطور گسترده‌ به لینک‌هایی اشاره شده که شما را به صفحات رسمی مربوط به APIها هدایت می‌کنند. کتاب با اطلاعاتِ مفیدی پر شده و داشتن آن برای هر برنامه‌نویس موبایل و یا برنامه‌نویس اندروید ضروری است.

شما در این کتاب مطالب زیر را یاد خواهید گرفت:

§       مقدمه کوتاهی بر سیستم عامل اندروید و محیط توسعه آن.

§       اجزاء اصلی برنامه‌های اندروید، مثل رابط کاربر، اخطار دهنده‌ها، و منابع.

§       ذخیره‌سازی و دسترسی به داده‌ها با استفاده از APIهای اندروید.

§       دسترسی به موقعیتِ کاربر، و نیز استفاده از حسگرهای دستگاه.

§       ضبط و پخش محتوای صوتی و تصویری، و دسترسی به دوربین دستگاه.

این کتاب مورد استفاده چه کسانی است؟

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

 


فصل 1

سیستم‌عامل اندروید

اندروید سیستم‌عاملی است که مخصوصاً برای دستگاه‌های قابل‌حمل (mobile)، از قبیل گوشی‌ها و تبلت‌ها، طراحی شده. این سیستم ترکیبی است از یک سیستم عامل، به همراه کتابخانه‌های بومی (native libraries)، برنامه‌های حین‌اجراء (application runtime)، و یک چهارچوب برنامه (application framework). با تکیه بر اینها، ما در این فصل مرور مختصری بر سیستم اندروید و نقش هر یک از این اجزاء در معماری کلی سیستم خواهیم داشت. تمرکز این کتاب بر روی نسخه 5.0 اندروید خواهد بود، که بانام آبنبات‌چوبی (Lollipop) شناخته می‌شود و در هنگام نوشتن این کتاب آخرین نسخه ارائه شده رسمی از این سیستم عامل است.

زیربنای معماری اندروید

به منظور اینکه اندروید زیربنای مستحکمی را فرهم آورد تا نیاز دستگاه‌های موبایل برآورده شود، این سیستم بر چند تکنولوژی متن‌باز (open source) تکیه کرده است. زیربنای این معماری را میتوان بصورت پنج لایه‌ اصلی توصیف کرد که هر یک از آنها کار متفاوتی را انجام میدهند. شکل 1-1 معماری سطح-بالای سیستم اندروید را در قالب این پنج لایه اصلی، به همراه اجزای فرعی هر یک از آنها نشان می‌دهد.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image001.png

شکل 1-1. طرح زیربنایی معماری اندروید

در این بخش ما هر یک از این لایه‌های اصلی را از پایین به بالا بررسی خواهیم کرد.

هسته لینوکس (Linux Kernel)

لایه پایینی زیربنای اندروید را هسته لینوکس تشکیل می‌دهد. اندروید برای اینکه بعنوان یک سیستم‌ عامل عمل کند به هسته لینوکس متکی است. لینوکس یک سیستم عامل قابل انتقال (Portable) یونیکس-مانند (UNIX-like) است که از استاندارد POSIX پیروی می‌کند. لینوکس یک سیستم عامل متن‌باز است و آزادانه توسعه داده می‌شود.

گنجاندن اندروید در لینوکس

به منظور اینکه نیازهای دستگاه‌های موبایل رفع شود، در هستهِ لینوکسِ اندروید تغییرات ساختاری انجام گرفته است. در این بخش ما به طور مختصر مهمترین مواردی که در هسته لینوکس گنجانده شده را بررسی می‌کنیم.

متصل‌کننده

اندروید بطور گسترده‌ای از ارتباطات میان-پردازشی (IPC[1]) استفاده می‌کند. برنامه‌های مختلف توسط IPC با سیستم‌عامل، گوشی، سرویس‌ها، و با برنامه‌های دیگر ارتباط برقرار می‌کنند. بدلیل اینکه مکانیزم IPC که توسط سیستم عامل لینوکس فراهم آمده برای دستگاه‌های قابل‌حمل بهینه نیست، اندروید به سیستم IPC خود متکی است، که متصل کننده (Binder) نام دارد. کانال ارتباط مرکزی در تمامی اندروید را این سیستم تشکیل می‌دهد. بدلیل اینکه متصل کننده در هستهِ لینوکسِ اندروید بصورت یک سرویسِ سطح-پایین پیاده‌سازی شده، انتظار نمی‌رود که برنامه‌نویسان بصورت مستقیم با آن سر و کار داشته باشند. اکثر رابط‌های برنامه نویسی (یا همان API) برای تعامل با سیستم به شکلی از متصل‌کننده‌ها استفاده می‌کنند که از دید برنامه‌نویس پنهان است.

به منظور اینکه متصل کننده با دیگر برنامه‌های سیستم تعامل برقرار کند، ابزارهای توسعه نرم‌افزارِ اندروید (یا SDK Android) زبانی را فراهم آورده که به AIDL[2] معروف است. AIDL به برنامه‌نویس اجازه می‌دهد تا یک میانجی (interface) را تعریف کند که هم برنامه‌ها بتوانند با یکدیگر ارتباط برقرار کنند و هم یک برنامه با یک سرویس (service) ارتباط برقرار کند. AIDL مکانیزمی را فراهم می‌کند که از آن طریق شیء عبور داده شده به اجزائی ابتدایی تجزیه می‌شوند که متصل کننده آنها را درک کند و بتواند در میانِ پردازش‌ها از آنها استفاده کند. شما در فصل 3 مطالب کاملتری در مورد AIDL یاد خواهید گرفت.

واقعه نگار

اساسی‌ترین ابزار برای رفع اشکال یک برنامه واقعه نگاری (Logging) است. برنامه‌های موبایل بشدت به محیط‌های که آنها را احاطه کرده وابسته‌اند، محیط‌هایی از قبیل شبکه‌های WiFi و یا داده‌هایی که از حسگرهای (sensors) دستگاه می‌رسند‌. به همین جهت برای رفع اشکال‌های پیچیده که شامل چنین محیط‌هایی می‌شود، واقعه نگاری‌های معمولی که در درون برنامه و توسط برنامه نویس انجام می‌شود کافی نیست. بنابراین، ضروری است که هم واقعه‌نگاری‌هایی که توسط سیستم‌عامل ثبت می‌شود، و هم آنهایی که توسط برنامه ثبت می‌شوند با یکدیگر ترکیب شده تا یک تصویر کامل از آنچه اتفاق افتاده بدست آید.

انجام این کار در برنامه‌های موبایل به مراتب دشوارتر است، زیرا توسعه برنامه و اجراء آن در دو دستگاه مختلف انجام می‌گیرند[3].

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

SDK اندروید ابزارهای لازم برای بازبینی وقایع ثبت شده را بصورت بلادرنگ (real-time) فراهم آورده که از فیلترهای پیشرفته نیز پشتیبانی می‌کنند.

قفل‌های بیدارباش

سیستم اندروید مخصوصاً طوری طراحی شده که بتواند بر روی دستگاه‌های موبایل که منابع محدودی دارند عمل کند. مهمترین نمونه از این نوع منابع باطری است، و به همین دلیل دستگاه‌های اندرویدی اغلب به حالت توان-پایین (low-powered) می‌روند، که به آن حالت خواب (sleep mode) نیز گفته می‌شود. گرچه این حالت اجازه می‌دهد که دستگاه از توان موجود بطور موثری استفاده کند، ولی هنگامی که یک سرویس، و یا یک برنامه، درحال انجام یک عملیات مهم است، ما نمی‌خواهیم دستگاه به حالت خواب برود.

به منظور اینکه برنامه‌ها بتوانند از بخواب رفتن دستگاه جلوگیری کنند،  قفل‌های بیدارباش (Wake locks) به هستهِ لینوکسِ اندروید اضافه شد.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

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

تایمرهای بیداری

همانطور که در بخش ” قفل‌های بیدارباش“ اشاره شد، دستگاه‌های اندرویدی برای صرفه‌جویی در مصرف برق به حالت خواب می‌روند. در طول حالت خواب هیچ برنامه‌ای نمی‌تواند اجراء شود، حتی سیستم عامل نیز متوقف می‌شود. به منظور اینکه برنامه‌ها بتوانند کارهای زمان‌بندی شده (scheduled) خود را انجام دهند، تایمر بیداری (alarm timer) به هستهِ لینوکسِ اندروید اضافه شد. هنگامی که تایمر بیداری از قبل تنظیم شود می‌تواند دستگاه را از حالت خواب بیدار کند.

برنامه کُش‌هایی که در حالت حافظه پایین عمل می‌کنند

مانند باطری، حافظه نیز یکی از منابع محدود دستگاه‌های موبایل را تشکیل می‌دهد. درکنار حجم محدود حافظه، بارگذاری برنامه‌ها در حافظه نیز کاری پرهزینه است. برای غلبه بر این مشکل، اندروید کلیه برنامه‌هایی که شروع شده‌اند را در حافظه نگاه می‌دارد، حتی آنهایی که کاربر تعاملی با آنها ندارد. اینکار اجازه می‌دهد تا کاربر بتواند سریعاً برنامه‌ جاری را عوض کند.

البته این بهینه‌سازی بهایی نیز دارد، و آن این است که به هر اندازه که برنامه‌های جدیدی شروع شوند، حافظه دستگاه نیز به همان میزان رو به اتمام می‌گذارد. به همین منظور، برنامه کُش‌ (low memory killer)، که به قاتل وایکینگ (Viking Killer) نیز مشهور است، به هستهِ لینوکسِ اندروید اضافه شد، که تا قبل از اینکه حافظه دستگاه تمام شود، حافظه مصرف شده بازپس‌گرفته شود.

همانطور که حافظه دستگاه از یک آستانه مشخص شروع به کم شدن می‌کند، برنامه کُش برنامه‌ها را از حافظه برمی‌دارد، و این کار را با برنامه‌هایی شروع می‌کند که اهمیت کمتری دارند.

اینکه چه برنامه‌ای اهمیت کمتر، یا بیشتری، دارد از روی میزان پیدا بودن آن برای کاربر تعیین می‌شود. برنامه‌یی که فعلاً در جلو دید کاربر قرار دارد مهمترین برنامه شمرده می‌شود. به همین ترتیب برنامه‌‌یی که در پشت صحنه قرار دارد و پیدا نیست از اهمیت کمتری برخوردار است‌‌. حالتِ جاریِ برنامه‌یی که در پشت صحنه قرار دارد از قبل ذخیره می‌شود و وقتی کاربر بخواهد این برنامه‌ را به جلو صحنه بیاورد، این حالت دوباره بازیابی می‌شود.

سیستمِ فایلی

اندروید برای سیستمِ فایلی اصلی خود بر سیستمی بنام YAFFS2[4] تکیه دارد. سیستم YAFFS2 مخصوصاً طوری طراحی شده که بخوبی روی فلاش چیپ‌های NAND عمل کند.

این سیستم فایلی همچنین طوری طراحی شده که بروزسازی بخش‌های مختلف سیستم عامل اندروید، بدون اینکه تاثیری روی بخش‌های دیگر داشته باشد، به راحتی انجام شود. این کار به این شکل انجام می‌شود که بخش‌های مختلف بر روی پارتیشن‌های (partition) مختلف ذخیره می‌شوند، و بدلیل اینکه وقتی سیستم عامل اندروید درحال اجراء است، اجزاء کلیدی آن غیرقابل تغییر هستند، این رویکرد باعث می‌شود تا ویروس‌ها و بدافزارها نتوانند اجزاء اصلی سیستم عامل را آلوده کنند و در نتیجه سیستم امنیت بیشتری داشته باشد.

پارتیشن‌های استفاده شده به سازنده دستگاه بستگی دارند. در زیر فهرستی از متداولترین پارتیشن‌ها و نقش کلی آنها در سیستم اندروید آمده است:

·       /boot: بوت لودر (boot loader) و هستهِ لینوکس را در خود جای می‌دهد. این پارتیشن فقط در هنگام آپدیت سیستم عامل قابل تغییر است، و در حین‌اجراء قابل نوشتن نیست.

·       /system: سیستم فایلی اندروید، و نیز برنامه‌هایی که توسط سازنده دستگاه باید قبل از بالا آمدن آن بارگذاری شوند را در خود جای می‌دهد.

·       /recovery: بمنظور عملیات بازیابی و تعمیرات، یک image از نسخه بازیابی (recovery) را در خود جای می‌دهد تا در هنگام بازیابی بتوان از آن استفاده کرد.

·       /data: برنامه‌ها و نیز فایل‌های مرتبط با آنها که توسط کاربر نصب شده‌اند را در خود جای می‌دهد. این پارتیشن در حین‌اجراء قابل نوشتن است، ولی بوسیله مجوز‌های (permissions) سیستمِ فایلی از آن محافظت می‌شود.

·       /cache: در این پارتیشن فایل‌های موقتی (temporary files)، و آن فایل‌هایی که بطور مکرر مورد استفاده قرار می‌گیرند، ذخیره می‌شود. به منظور اینکه دسترسی به اینگونه فایل‌ها سریعتر انجام شود، در بیشتر دستگاه‌های اندرویدی این پارتیشن در حافظه RAM نگاهداری می‌شود.

کتابخانه‌های  بومی

در بالای لایه هستهِ لینوکس، مجموعه‌ای از کتابخانه‌های بومی (native libraries) قرار دارند. سرویس‌ها و کارهایی که در لایه حین‌اجرای (runtime) اندروید ارائه شده‌اند، عمدتاً توسط کتابخانه‌های بومی انجام می‌شوند. مهمترین آنها عبارتند از:

·       SQLite: به منظور اینکه برنامه‌های اندرویدی بتوانند براحتی و بطور سریع به داده‌های ساخت‌یافته دسترسی داشته باشند، اندروید یک بانک اطلاعاتی رابطه‌ای SQL را ارائه میدهد که علاوه‌ بر فایل‌ها می‌تواند در حافظه نیز عمل کند.

·       WebKit: امکان نمایش HTML/CSS و نیز اجرای JavaScript را فراهم می‌آورد که توسط آن برنامه‌های اندرویدی می‌توانند از تکنولوژی وِب بهره‌مند شوند.

·       OpenGL ES: امکان نمایش سریع تصاویر دو بعدی (2D) و سه-بعدی (3D) را فراهم می‌کند.

·       Open Core: یک چهارچوب رسانه‌ای را فراهم می‌آورد تا برنامه‌های اندرویدی بتوانند محتواهای صوتی و تصویری را پخش، یا ضبط، کنند.

·       OpenSSL: امکان استفاده از پروتکل‌های SSL[5] و [6]TLS را فراهم می‌آورد تا برنامه‌های اندرویدی بتوانند بصورت امن، و با استفاده از رمزنگاری (cryptography)، با سرویس‌های دور ارتباط برقرار کنند.

حین‌اجراهای اندروید

حین‌اجرای‌های اندروید (Android Runtimes) بخشی است که کارهای مختلف سیستم اندروید را هماهنگ می‌کند. این بخش وظیفه اجرای سرویس‌ها و همینطور برنامه‌هایی که در سیستم اجرا می‌شوند را بر عهده دارد.

ART

جاوا (Java) زبان رسمی برنامه‌نویسی اندروید است. جاوا یک زبان همه-منظوره و شیء‌گرا است که مخصوصاً برای توسعه برنامه‌هایی طراحی شده که به دستگاه خاصی وابسته نباشند. جاوا اینکار را با ترجمه کردن (compiling) کدهای برنامه به یک زبان میانجی (intermediate) تَفسیری (interpreted)، بنام بایت کد (bytecode)، انجام می‌دهد که به سیستم خاصی وابسته نیست. این بایت کدها توسط برنامه‌ای اجرا می‌شوند که ماشین مجازی جاوا (Java Virtual Machine) نام دارد، و در سیستم مورد نظر درحال اجرا است.

حین‌اجرای اندروید (ART) [7] یک نوع ماشین مجازی جاوا است که اخیراً در اندروید نسخه 4.4 به بعد معرفی شد و در اندروید 5.0 رسماً بعنوان ماشین مجازی اجرای برنامه‌های جاوا از آن استفاده می‌شود. پیش از آن، برنامه‌های اندرویدی توسط ماشین مجازی دالویک (Dalvik Virtual Machine) اجرا می‌شدند.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

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

در مقایسه با دالویک که ترجمه بایت‌کدها را درست در همان زمان اجراء (JIT)[8] انجام می‌دهد، رویکرد ART این است که ترجمه بایت‌کدها  را پیش از زمان اجراء (AOT)[9] و در زمان نصب برنامه انجام می‌دهد. این کار باعث می‌شود تا بعداً کدهای برنامه مستقیماً در محیطِ حین‌اجرای دستگاه اجراء شوند.

برنامه‌های اندرویدی ترجمه شده

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

به منظور اینکه پکیج‌های (packages) تولید شده و کدهای باینری (binaries) هم با ART و هم با دالویک سازگار باشند، هنوز هم پکیج‌های جدید بر اساس ویژگی‌های دالویک ساخته می‌شوند. بدلیل اینکه ماشین مجازی دالویک مخصوصاً برای دستگاه‌های موبال طراحی و بهینه‌سازی شده، این ماشین تنها نوع بخصوصی از بایت‌کد را می‌فهمد که به برنامه‌های اجرایی دالویک (DEX)[10] شناخته می‌شوند. در SDK اندروید ابزارهایی ارائه شده که می‌توانند در هنگام بسته‌بندی برنامه‌ها (یا پکیج سازی)، بایت‌کدهای استاندارد جاوا را به بایت‌کدهای DEX ترجمه کنند. هنگامی که یک پکیج روی دستگاه نصب می‌شود، ART بصورت خودکار کدهای فرمت DEX دالویک را به کدهای فرمت OAT، که برای ART مناسب است، ترجمه می‌کند.

برنامه‌های قرنطینه شده

مسئله امنیت یکی از مواردی بوده که از ابتدای طراحی اندروید به آن توجه شده. در این سیستم هر برنامه در یک محیط قرنطینه (sandbox) اجراء می‌شود که کدها و داده‌های هر برنامه را از دیگر برنامه‌ها جدا می‌کند.

·       هر برنامه در یک ART مختص به خودش اجراء می‌شود.

·       توسط مجوزهای سیستم‌عامل (permissions) از داده‌های برنامه حفاظت می‌شود. هر برنامه در زمان نصب خود یک حساب (account) دریافت می‌کند، و سیستم‌عامل دسترسی حسابهای دیگر به داده‌های برنامه را ممنوع می‌کند، بصورتی که فقط خود برنامه به داده‌های خود دسترسی دارد.

·       برنامه‌ها فقط از طریق میانجی‌های ارتباطی که سیستم اندروید فراهم آورده می‌توانند با سیستم، و یا دیگر برنامه‌ها، ارتباط برقرار کنند. خود این میانجی‌ها نیز توسط مجوزهای اندروید محافظت می‌شود.

زیگوت

زیگوت (یا زآی‌گوت Zygote) مادر تمام برنامه‌های اندروید است. زیگوت یکی از پروسه‌های  (processes) اصلی است که با بوت شدن سیستم آغاز می‌شود. زیگوت دو نقش عمده دارد:

·       هنگامی که سیستم بوت شد، زیگوت یک ماشین مجازی  ART را آغاز می‌کند و سرویس‌های اصلی اندروید، مثل توان (Power)، تلفن (Telephony)، محتوا (Content)، و پکیج (Package)، را اجرا می‌کند.

·       همانطور که قبلاً اشاره شد، در سیستم اندروید هر برنامه در داخل ماشین مجازی ART مخصوص به خودش اجراء می‌شود. با اجراء شدن هر برنامه، یک ماشین ART جدید شروع می‌شود و همراه با آن، اجزاء اندروید نیز در حافظه بارگذاری می‌شوند، که این کار بسیار پرهزینه‌ای است. زیگوت با استفاده از مکانیزمی بنام منشعب‌ شدن (forking) [11] این مشکل را حل می‌کند. هنگامی که کاربر تقاضای اجرای یک برنامه را می‌کند، زیگوت خیلی ساده خودش را منشعب می‌کند. در طول منشعب شدن، پروسه زیگوت موجود بعنوان یک پروسه جدید تکثیر می‌شود. هم پروسه قبلی زیگوت و هم پروسه جدید هر دو از منابع قبلاً-بارگذاری شده اندروید استفاده می‌کنند. این روند اجازه می‌دهد تا برنامه‌ها خیلی سریع شروع شوند، و فضای کمتری را نیز اشغال کنند.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

در علوم کامپیوتر، انشعاب (یا شاخه‌شاخه شدن) عملی است که در طی آن پروسه موجود تکثیر می‌شود. هرچند هریک از این دو پروسه بطور مستقل اجراء می‌شوند، ولی پروسه جدیداً تکثیر شده دقیقاً کپی پروسه قبلی است. تا وقتی که یکی از این پروسه‌ها سعی نکند که قسمتی از حافظه مشترک را تغییر دهد، انشعاب اجازه می‌دهد تا هر دو آنها در استفاده از این حافظه با یکدیگر سهیم باشند.

چهارچوب برنامه

چهارچوب برنامه (Application Framework) در بالای ماشین مجازی ART اجراء می‌شود و میانجی را فراهم می‌آورد که برنامه‌های اندرویدی بتوانند با سیستم عامل و دستگاه تعامل برقرار کنند. در اینجا سرویس‌هایی مانند مدیریت پکیج (Package Managerمدیریت تلفن (Telephony Managerمدیریت مکان‌یابی (Location Manager)، و مدیریت اخطار (Notifications Manager) در دسترس قرار می‌گیرند.

برنامه‌ها

فضای برنامه شامل تمام برنامه‌های اندرویدی است که در بالای ماشین مجازی ART اجراء می‌شوند. این برنامه‌ها هم شامل برنامه‌های شخص-ثالث (third-party) است که از بازار اندروید دانلود شده‌اند و هم برنامه‌های سیستمی، مثل دفترچه‌ تلفن (Contactsتلفن (Phone)، و مرورگر اینترنت (Browser). در این کتاب شما یاد خواهید گرفت که چگونه با استفاده از میانجی برنامه نویسی اندروید (Android API) برنامه‌هایی را توسعه دهید که در فضای برنامه (application space) اندروید اجراء شوند.

نسخه‌های اندروید

وقتی از اندروید صحبت شود، شما اغلب می‌شنوید که از نسخه اندروید بصورت‌های مختلفی یاد می‌شود. مثلاً گفته می‌شود:

·       این برنامه به نسخه Jelly Bean یا بالاتر نیاز دارد.

·       بالاخره برای گوشی من آپ‌دیت 4.1 آمده.

·       سرویس مدیریت آشکارسازی شبکه (Network Service Discovery Manager) از API سطح 16 به بالا در دسترس است.

در این بخش ما هر یک از این نام‌گذاری‌ها و ارتباط آنها با یکدیگر را بررسی می‌کنیم. جدول
1-1 ارتباط آنها با یکدیگر را نشان می‌دهد.

شماره گذاری پلات‌فرم

در شماره گذاری پلات‌فرم (Platform) از شماره‌ای استفاده می‌شود که تغییر آن نشان دهنده تغییرات مهمی در سیستم عامل اندروید است. این شماره از دو (یا سه) عدد صحیح تشکیل می‌شود که با نقطه از هم جدا می‌شوند، مثلاً مینویسند اندروید نسخه  4.0.3.

در اینجا اولین عدد (سمت چپی) نشان دهنده شماره نسخه اصلی است و تنها وقتی زیاد می‌شود که تغییر عمده‌ای در عملکرد سیستم عامل پدید آمده باشد. اعداد دوم و سوم نشاندهند شماره نسخه‌های فرعی هستند و تغییر آنها نمایانگر تغییرات کوچک و یا رفع اشکال‌هایی است که در نسخه اصلی پدید آمده. بر همین اساس، آپدیتی که از اندروید نسخه 3.2 به 4.0 انجام گیرد نشان‌دهنده یک آپدیت عمده است، و آپدیتی که از نسخه 4.0 به 4.0.1 انجام شود نشان‌دهنده رفع اشکال‌های جزیی است.

در تاریخ نوشتن این کتاب، آخرین نسخه اندروید بر اساس پلات‌فرم، اندروید 5.1 است. سیستم عامل اندروید از زمان پیدایش نسخه 1.0 آن (در تاریخ 23 سپتامبر 2008) بطور مرتب آپدیت می‌شود.

اسم رمز پلات‌فرم

بدلیل اینکه این فقط برنامه‌نویسان نیستند که مخاطب این سیستم عامل تشکیل می‌دهند، از آوریل 2009 به بعد، هر نسخه پلاتفرم نه فقط دارای یک شماره، بلکه دارای یک اسم رمز نیز هست که فعلاً بر اساس نام دِسرها وشیرینی‌جات مختلف نامگذاری شده‌اند، اسامی مانند کیت‌کت (KitKatآبنبات پاستیلی (Jelly Beanبستنی حصیری (Ice Cream sandwich) و  آبنبات چوبی (Lollipop).

سطح API

گرچه رفع اشکال‌های جزیی سیستم‌عامل معمولاً از نظر توسعه دهندگان برنامه پنهان است، ولی آپدیت‌های عمده‌ای که در سیستم پدید می‌آید نشان‌دهنده تغییرات عمده و اضافه شدن موارد جدید به API اندروید است.

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

در پورتال توسعه دهندگان اندروید، همیشه در مستندات مربوط به API، سطح هر API مشخص شده

جدول 1-1. تاریخ بیرون دهی، شماره نسخه پلات‌فرم، اسم رمز، و سطح API اندروید

تاریخ بیرون‌دهی

نسخه پلات‌فرم

اسم‌رمز پلات‌فرم

سطح API

سپتامبر 2008

1.0

--

1

فوریه 2009

1.1

--

2

آوریل 2009

1.5

Cupcake

3

سپتامبر 2009

1.6

Donut

4

اکتبر 2009

2.0

Éclair

5

دسامبر 2009

2.0.1

Éclair

6

ژانویه 2010

2.1

Éclair

7

می 2010

2.2-2.2.3

Froyo

8

دسامبر 2010

2.3-2.3.2

Gingerbread

9

فوریه 2011

2.3.3-2.3.7

Gingerbread

10

فوریه 2011

3.0

Honeycomb

11

می 2011

3.1

Honeycomb

12

جولای 2011

3.2-3.2.6

Honeycomb

13

اکتبر 2011

4.0-4.0.2

Ice Cream Sandwich

14

دسامبر 2011

4.0.3-4.0.4

Ice Cream Sandwich

15

جولای 2012

4.1-4.1.2

Jelly Bean

16

نوامبر 2012

4.2-4.2.2

Jelly Bean

17

جولای 2013

4.3-4.3.1

Jelly Bean

18

اکتبر 2013

4.4-4.4.4

KitKat

19

جولای 2014

4.4w

KitKat+  افزونه‌های پوشیدنی

20

نوامبر 2014

5.0

Lollipop

21

شما می‌توانید از جدول 1-1 بعنوان مرجعی برای معادل‌یابی نسخه‌های مختلف اندروید استفاده کنید.

سیستم اندروید بطور فعالی درحال توسعه است. همانطور که در جدول 1-1 نشان داده شده، اندروید در طول چهار سال دوچار تغییرات عمده‌ای شده و آپدیت‌ها و رفع‌اشکال‌های زیادی در آن بعمل آمده.

آمار پراکندگی نسخه‌های مختلف اندروید

ممکن است شما با نگاه کردن به جدول 1-1 پیش خود تصور کنید که بدلیل اینکه بیش از یک سال از بیرون دهی نسخه 4.4 می‌گذرد پس بر روی اکثر دستگاه‌های اندرویدی حداقل باید این نسخه نصب شده باشند. ولی چنین نیست. بدلیل پراکندگی بالا، جدیدتر بودن تاریخ بیرون دهی نسخه‌های اندروید نشانه این نیست که اکثر دستگاه‌ها از این نسخه استفاده می‌کنند.

در جدول 2-1 آمار پراکندگی نصب نسخه‌های مختلف تا ماه دسامبر 2014 نشان داده شده است.

جدول 2-1 میزان پراکندگی نسخه‌های مختلف اندروید[12].

نسخه پلات‌فرم

اسم‌رمز پلات‌فرم

سطح API

میزان توزیع

2.2–2.2.3

Froyo

8

0.5%

2.3.3–2.3.7

Gingerbread

9

9.1%

4.0.3–4.0.4

Ice Cream Sandwich

15

7.8%

4.1–4.1.2

Jelly Bean

16

21.3%

4.2–4.2.2

Jelly Bean

17

20.4%

4.3–4.3.1

Jelly Bean

18

7.0%

4.4–4.4.4

KitKat

19

33.9%

فعلاً 21 سطح مختلف از API موجود  است که شما می‌توانید برای توسعه نرم‌افزارهای جدید از آنها استفاده کنید، ولی مطمئن شوید که جدول توزیع نسخه‌ها را نیز درنظر گرفته‌اید. هرچند سطوح بالاتر API امکانات و ویژگی‌های جدیدتری را در اختیار برنامه‌نویس قرار می‌دهد، ولی به میزان مخاطبین نیز باید توجه داشت، زیرا هر چقدر سطح API استفاده شده در برنامه کوچکتر باشد بر روی دستگاه‌های بیشتری قابل اجراء خواهد بود.

کتابخانه پشتیبان اندروید

گرچه استفاده از سطوح پایینتر API بر تعداد مخاطبین برنامه‌های شما خواهد افزود، ولی دست شما را برای استفاده از ویژگی‌های جدید اندروید در برنامه‌ها تنگ‌تر می‌کند. برای غلبه بر این مشکل، کتابخانه پشتیبان اندروید (Android Support Library) فراهم آمده. پکیج کتابخانه پشتیبان اندروید شامل یک سری از برنامه‌های کتابخانهای است که امکان سازگاری برنامه‌ها با سطوح جدیدتر API را فراهم می‌آورد. این یعنی درحالی که شما برنامه خود را بر سطح 4 به بالا تنظیم کرده‌اید، برنامه می‌تواند از امکاناتی استفاده کند که در سطوح 19 به بالا در دسترس هستند. گنجاندن کتابخانه پشتیبان اندروید در برنامه‌ها، روش بسیار خوبی برای توسعه نرم‌افزارهای اندرویدی محسوب می‌شود.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

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

هر کتابخانه پشتیبان اندروید سطوح API مختلفی را مورد هدف قرار می‌دهد و بر همین اساس خصوصیات مختلفی را برای استفاده در سطوح پاینتر فراهم می‌آورد. شما باید کتابخانه‌ پشتیبانی را انتخاب کنید که با خصوصیاتی که به آن نیاز دارید مطابق باشد. صفحه راهنمای ویژگی‌های کتابخانه پشتیبان[13] می‌تواند شما را برای انتخاب کتابخانه مورد نیازتان راهنمایی کند.

شما در فصل‌های آتی با گنجاندن کتابخانه پشتیبان اندروید در برنامه‌هایتان بیشتر آشنا خواهید شد.

خلاصه

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

 


فصل 2

محیط توسعه برنامه

 

اندروید دارای یک محیط توسعه کامل و پیشرفته است که می‌تواند بر روی تمام سیستم‌ عامل‌های مهم اجراء شود.

زنجیره ابزارهای اندروید

پروژه متن باز اندروید (AOSP)، که یک جامعه نرم‌افزاری است، زنجیره ابزارهای (toolchain) کاملی را برای توسعه نرم‌افزارهای اندروید فراهم آورده.

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

زنجیره ابزارهای اندروید از چهار جزء اصلی تشکیل شده. در این بخش ما هر یک از این اجزاء را مورد بررسی قرار می‌دهیم.

کیت توسعه نرم‌افزار اندروید (SDK)

کیت توسعه نرم‌افزار (SDK) اندروید جزء اصلی زنجیره است. SDK اندروید موارد زیر را فراهم آورده:

·       دسترسی به کتابخانه API جاوا

·       پکیج‌ساز برنامه

·       شبیه‌سازهای دستگاه‌های موبایل

·       بهینه‌ساز بایت‌کد و به مُبهم‌سازی (Obfuscator) آنها

·       پُلی برای رفع اشکال برنامه‌ها

·       برنامه‌های نمونه و آموزشی

·       مستندات مربوط به اندروید

از میان زنجیره ابزارهای اندروید، SDK تنها جزء لازم برای تولید برنامه‌های اندروید است.

کیت توسعه نرم‌افزارِ بومی اندروید (NDK)

همانطور که در فصل 1 اشاره شد، اندروید برای انجام کارهای سیستم‌عاملی خود به هسته لینوکس تکیه دارد. ترکیب هسته لینوکس و کتابخانه‌ C  BSD کلیه مقتضیات لازم برای اجرای برنامه‌های غیر-جاوا  و  وابسته-به‌دستگاه را فراهم می‌کند.

به همین جهت می‌توان برنامه‌هایی که به کارآیی و سرعت بالا نیاز دارند را با استفاده از زبان‌هایی که به زبان ماشین نزدیکترند، مثل زبانهای C، C++، و یا اسمبلی نوشت. علاوه بر افزایش سرعت و کارایی، اینکار مزیت دیگری نیز دارد و آنهم استفاده مجدد از کُد برنامه‌هایی است که قبلاً به این زبانها نوشته شده و حالا بدون اینکه نیازی به دوباره نوشتن آنها به زبان جاوا باشد می‌توان از این کُدهای قدیمی استفاده کرد.

کیت توسعه نرم‌افزار بومی اندروید (یا NDK[14]) یک سری ابزار تکمیلی برای SDK ارائه می‌دهد که با استفاده از آنها برنامه‌نویس قادر است کدهایی بومی[15] را بدون هیچ درزی در برنامه‌های مبتنی بر جاوا جاسازی کند.

NDK اندروید شامل کامپایلرها، دیباگرها (اشکالزداها فایل‌های سرآمد (header)، و همچنین مستندات کامل می‌باشد.

ابزارهای توسعه اندروید برای اکلیپس

ابزارهای توسعه اندروید  (ADT[16]) برای اکلیپس (Eclipse) جزء اولین ابزارهایی بود که برای ایجاد یک محیط توسعه یکپارچه (IDE) برای تولید برنامه‌های اندروید فراهم آمد. مانند دیگر ابزارهای زنجیره، اینکار نیز با تغییرات و اضافه کردن خصوصیات جدید به اکلیپس انجام گرفت.

اندروید استودیو

در ماه می 2013 گوگل یک برنامه جدیدِ IDE، بنام اندروید استودیو (Android Studio)[17]، را برای توسعه برنامه‌های اندروید معرفی کرد. اندروید استودیو نیز یک IDE سفارشی‌شده (customized) است که به برنامه IntelliJ IDEA تکیه دارد. اندروید استودیو نسبت به Eclipse ADT ویژگی‌های جدیدی، مثل پشتیبانی از نسخه‌های مختلف و غنیتر بودن رابط کاربری (UI) برای ویرایش الگوها (layout)، را فراهم می‌آورد. اولین نسخه باثبات (stable) از اندروید استودیو در ماه دسامبر 2014 منتشر شد.

فعلاً اندروید استودیو بعنوان IDE رسمی اندروید شناخته می‌شود و ما نیز در این کتاب بجای اکلیپس از اندروید استودیو استفاده می‌کنیم.

تنظیمات مربوط به محیط توسعه

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

تنها پیش‌نیازهایی که برای نصب اندروید استودیو وجود دارد یکی نصب JDK[18] است و دیگری JRE[19] است. زنجیره توسعه نرم‌افزار از انواع مختلفی از JDK و JRE پشتیبانی می‌کند، مثلاً Open JDK، IBM JDK، و Oracle JDK (که قبلاً به Sun JDK معروف بود). در این کتاب ما برای یکنواختی از Oracle JDK استفاده می‌کنیم.

هرچند زنجیره توسعه نرم‌افزار اندروید هم از جاوای نسخه‌ 6 و هم نسخه 7 پشتیبانی می‌کند، به منظور اینکه شما برای نسخه‌های بعدی اندروید آماده باشید، ما توصیه می‌کنیم نسخه 7 را روی کامپیوتر خود نصب کنید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

بدلیل اینکه اندروید بطور سریعی درحال تحول است، ممکن است ملزوماتِ نسخه‌های جدید زنجیره توسعه اندروید با آنچه در اینجا بیان شده متفاوت باشد. برای اطلاع از آخرین تغییرات به صفحه اندروید استودیو رجوع کنید.

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

نصب بر روی ویندوز مایکروسافت

در ویندوز، هم اندروید استودیو و هم برنامه‌های مربوط به جاوا همه در یک بسته ارائه شده‌اند. برنامه شما را در نصب هر دو یاری می‌کند.

دانلود و نصب JDK در ویندوز

1.     با استفاده از مرورگر خود به صفحه دانلود جاوای اوراکل بروید:

http://www.oracle.com/technetwork/java/javase/downloads/index.html

          این صفحه شما را به فهرستی از گزینه‌ها راهنمایی می‌کند.

2.     به گزینه مربوط به دانلود جاوا 7 بروید.

3.     روی دکمه JDK کلیک کنید تا برنامه نصب جاوا دانلود شود. در زمان نوشتن این کتاب آخرین نسخه جاوا 8 است.

4.     ویزاردِ (wizard) نصبِ جاوا، هم JDK و هم JRE را نصب می‌کند. در طول این فرایند شما می‌توانید مقادیر پیش‌فرض انتخاب را انتخاب کنید، و یا متناسب با نیازتان آنها را تغییر دهید.

ویزاردِ نصب بصورت خودکار تغییرات لازم را در سیستم بعمل خواهد آورد تا هم JDK و هم JRE برای همه برنامه‌های ویندوز، از جمله اندروید استودیو، قابل دسترس باشند.

دانلود و نصب اندروید استودیو بر روی ویندوز

1.     با استفاده از مرورگر به آدرس صفحه اندروید استودیو بروید:

http://developer.android.com/sdk/installing/studio.html

2.     سیستم‌عاملِ شما توسط وب‌سایت تشخیص داده می‌شود و شما به سمت دانلود اندروید استودیوی مناسب با سیستم عامل‌تان هدایت می‌شوید.

3.     دکمه مربوطه را فشار دهید تا برنامه نصب اندروید استودیو دانلود شود. در زمان نوشتن این کتاب آخرین نسخه اندروید استودیو 1.2.1.1 است.

4.     ویزارد شما را در نصب اندروید استودیو هدایت می‌کند.

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

نصب بر روی مک او اِس اپِل

در Mac OS X، هم بسته‌های مربوط به Java و هم اندروید استودیو بصورت برنامه‌های جداگانه ارائه می‌شوند.

دانلود و نصب JDK بر روی Mac OS X

1.     با استفاده از مرورگر خود به صفحه دانلود جاوای اوراکل بروید:

http://www.oracle.com/technetwork/java/javase/downloads/index.html

2.     به قسمت Java 7 بروید.

3.     دکمه JDK را فشار دهید تا  image مربوط به Java 7 دانلود شود.

4.     هنگامی که دانلود به پایان رسید، روی image دانلود شده دابل‌کلیک کنید تا این  ایمج روی فایل سیستم سوار (mount) شود. این ایمج دربردارنده برنامه نصب Java 7 است.

5.     برنامه نصب Java 7 را اجراء کنید. این برنامه هم JDK و هم JRE را بر روی کامپیوتر شما نصب می‌کند.

 

ویزاردِ نصب بصورت خودکار تغییرات لازم را در سیستم بعمل خواهد آورد تا هم JDK و هم JRE برای همه برنامه‌های Mac OS، از جمله اندروید استودیو، قابل دسترس باشند.

دانلود و نصب اندروید استودیو بر روی Mac OS X

1.     با استفاده از مرورگر به صفحه مربوط به اندروید استودیو بروید:

http://developer.android.com/sdk/installing/studio.html

2.     سیستم‌عاملِ شما توسط وب‌سایت تشخیص داده می‌شود و شما به سمت دانلود اندروید استودیوی مناسب با سیستم عامل‌تان هدایت می‌شوید.

3.     دکمه مربوطه را فشار دهید تا image نصبِ اندروید استودیو دانلود شود. در زمان نوشتن این کتاب آخرین نسخه اندروید استودیو 1.2.1.1 است.

4.     هنگامی که دانلود کامل شد روی ایمج دانلود شده دابل کلیک کنید تا بر روی فایل سیستم نصب شود.

5.     آیکن اندروید استودیو را بر روی آیکن Applications بکشید و رها کنید تا اندروید استودیو نصب شود.

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

نصب روی لینوکسِ اوبونتو

در مقایسه با ویندوز و یا مک او.اس، در لینوکس اوبونتو نه برنامه نصب جاوا، و نه اندروید استودیو، بصورت برنامه‌های نصبی ارائه شده‌اند. در اینجا هر دو برنامه بصورت فایلهای tar ارائه می‌شوند که شما باید آنها را بصورت دستی نصب کنید:

1.     به منظور اینکه تنظیمات محیطی آسانتر شود، در این بخش ما فرض می‌کنیم که کلیه اجزاء ”زنجیره ابزارهای توسعه اندروید“، یعنی برنامه‌های مربوط به Java 7 و نیز اندروید استودیو در یک زیردایرکتوری بنام android نصب شده‌اند که در home directory کاربر قرار دارد. یک ترمینال باز کنید، و دستور ساخت دایرکتوری android را صادر کنید.

mkdir ~/android

2.     با استفاده از دستور cd ~/android دایرکتوری جاری را به دایرکتوری android تغییر دهید.

دانلود و نصب JDK بر روی Linux

1.     با استفاده از مرورگر خود به صفحه دانلود جاوای اوراکل بروید:

http://www.oracle.com/technetwork/java/javase/downloads/index.html

2.     به قسمت Java 7 بروید.

3.     دکمه JDK را فشار دهید تا فایل tar مربوط به Java 7 دانلود شود.

4.     هنگامی که دانلود به پایان رسید، با استفاده از دستور زیر فایل tar دانلود شده را در دایرکتوری اندروید باز کنید

tar zxf ~/Downloads/jdk-7u71-linux-i586.tar.gz

نام فایل را متناسب با نام فایل دانلود شده تغییر دهید.

دانلود و نصب اندروید استودیو بر روی لینوکسِ ابونتو

1.     با استفاده از مرورگر به صفحه اندروید استودیو بروید:

http://developer.android.com/sdk/installing/studio.html

2.     وب‌سایت سیستم‌عامل شما را تشخیص می‌دهد و شما را به سمت دانلود اندروید استودیوی مناسب با سیستم عامل‌تان هدایت میکند.

3.     دکمه مربوطه را فشار دهید تا فایل tar اندروید استودیو دانلود شود. در زمان نوشتن این کتاب آخرین نسخه اندروید استودیو 1.2.1.1 است.

4.     هنگامی که دانلود کامل شد با استفاده از دستور زیر برنامه اندروید استودیو را روی کامپیوتر خود نصب کنید:

tar xvf ~/Downloads/android-studio-bundle-135.1641136-linux.tgz

5.     حالا شما با صدور دستور زیر می‌توانید اندروید استودیو را اجراء کنید:

~/android/android-studio/studio.sh

یک برنامه ساده Hello Android

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

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

برای ایجاد یک پروژه جدید مراحل زیر را انجام دهید:

1.     هنگامی که شما برای اولین بار اندروید استودیو را اجراء می‌کنید دیالوگ Quick Start برای شما نشان داده می‌شود:

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image004.jpg

شکل 1-2 دیالوگ Quick Start

2.     روی مورد اول، یعنی Start a new android project، کلیک کنید.

3.     در اینجا دیالوگ دیگری بصورت شکل 2-2 برای شما ظاهر می‌شود:

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image005.jpg

شکل 2-2 دیالوگ ایجاد پروژه جدید

4.     مقدار Application Name  را Hello Android قرار دهید.

5.     مقدار Company Domain را apress.com قرار دهید.

6.     دکمه Next را فشار دهید.

7.     همانطور که در شکل 3-2 نشان داده شده، در این مرحله اندروید استودیو از شما خواهد خواست تا واسطِ برنامه نویسی مورد نظر خود (یعنی سطح API آن) را مشخص کنید. برای این مقدار عدد 21 را انتخاب کنید که مشخص کننده اندروید 5.0 یا Lollipop است.

 

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image006.jpg

شکل 3-2 مشخص کردن سطح API پروژه

8.     همانگونه که در شکل 4-2 نشان داده شده، در صفحه بعدی Blank Activity را انتخاب کرده و دکمه Next را فشار دهید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image007.jpg

شکل 4-2 انتخاب نوع activity پروژه

9.     همانطور که در شکل 5-2 نشان داده شده از مقادیر پیش‌فرض برای activity پروژه استفاده کنید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image008.jpg

شکل 5-2 نام activity

10. برای تکمیل ویزاردِ ایجادِ پروژه جدید، دکمه Finish را فشار دهید.

11. همانطور که در شکل 6-2 نشان داده شده، اندروید استودیو صفحه‌ای را نشان میدهد که می‌توانید پروژه جدید خود را در آن ویرایش کنید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image009.jpg

شکل 6-2 صفحه ویرایشگر پروژه جدید

ساخت برنامه اندروید

برای ساخت برنامه شما می‌توانید گزینه Build Make Project را از منوی بالایی اندروید استودیو انتخاب کنید.

اجرای برنامه اندروید

هنگامی که برنامه ساخته شد، این برنامه هم می‌تواند در یک دستگاه اندرویدی واقعی و هم در شبیه‌ساز (emulator) دستگاه اندروید (که بعنوان یکی از اجزاء زنجیره توسعه روی کامپیوتر شما موجود است) بر روی کامپیوتر اجراء شود.

برنامه‌های ساخته شده می‌توانند روی هر دستگاه اندرویدی اجراء شوند، البته بشرطی که نسخه اندروید دستگاه با حداقل سطح API درنظر گرفته شده برای ساخت برنامه برابر، و یا از آن بزرگتر، باشد.

فعال کردن حالت USB debuge در دستگاه اندرویدی

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

اگر نسخه دستگاه اندرویدی شما 4.2 به بالا است، شما می‌توانید به روش زیر USB Debug mode را فعال کنید:

1-   ابتدا مطمئن شوید که دستگاه شما توسط کابل USB به کامپیوتر متصل نباشد.

2-   در دستگاه اندرویدی به صفحه Setting بروید.

3-   به قسمت About بروید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

در دستگاه‌های Samsung Galaxy ابتدا به More/General و سپس به About بروید.

4-   در صفحه About، دقیقاً 7 بار مورد Build Number را فشار دهید.

5-   درصورتی که اینکار موفقیت آمیز باشد پیامی شبیه به ”Developer mode has been Enabled“ برای شما ظاهر می‌شود.

6-   حالا به صفحه Settings بازگردید.

7-   با Scroll کردن به پایین، شما خواهید دید که گزینه دیگری بنام Developer Options به گزینه‌های Settings اضافه شده.

8-   در Developer Options مورد USB Debugging را فعال کنید.

9-   حالا دستگاه را با استفاده از کابل USB به کامپیوتر متصل کنید.

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

11-                   برای ادامه به این درخواست پاسخ مثبت دهید.

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

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

بدلیل اینکه ممکن است مراحل ذکر شده برای دستگاه شما متفاوت باشد، شما می‌توانید برای اطلاع از چگونگی فعال کردن حالت USB Debug در دستگاه‌های مختلف به صفحه زیر مراجعه کنید:

http://www.droidviews.com/how-to-enable-developer-optionsusb-debugging-mode-on-devices-with-android-4-2-jelly-bean/

اجرای برنامه بر روی دستگاه اندرویدی

برای اجرای برنامه، از نوار منوی بالایی مورد Run Run را برای تعیین دستگاهِ اجراء کننده انتخاب کنید.

همانطور که در شکل 7-2 نشان داده شده با اینکار دیالوگی ظاهر می‌شود که شما می‌توانید در آن دستگاهی را که می‌خواهید برنامه در آن اجراء شود را انتخاب کنید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image010.jpg

شکل 7-2 انتخاب دستگاه‌های اندرویدی متصل شده

دستگاه مورد نظر خود را انتخاب کرده و دکمه OK را برای اجراء برنامه بر روی آن فشار دهید.

به منظور ظاهر شدن یک دستگاه‌ در این لیست، حتماً لازم است که حالت USB Debug mode برای دستگاه مورد نظر فعال شود.


Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

اندروید استودیو علاوه بر اجرای برنامه‌ها بر روی دستگاه‌های واقعی، می‌تواند آنها را بر روی شبیه‌سازهایی که در کامپیوتر توسعه‌دهنده قرار دارند نیز اجراء کند. برای اجرای برنامه‌ها بر روی شبیه‌سازهای اندروید، شما بسادگی می‌توانید در دیالوگ مربوط به Choose Device گزینه Launch Emulator را انتخاب کرده و از منوی مربوطه یکی  از این دستگاه‌های مجازی را انتخاب کنید. شما میتوانید با استفاده از برنامه AVD Manager شبیه‌سازهای دیگری با مشخصات متفاوت ایجاد کنید.

خلاصه

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

 

فصل 3

اجزاء مختلف یک برنامه اندروید

به منظور تولید برنامه‌های موبایلِ باثبات، که با یکدیگر ‌کنش‌پذیر (interoperable) باشند، اندروید مجموعه‌ای از کامپوننت‌ها (components) را برای توسعه دهندگان فراهم آورده. در این فصل شما با کامپوننت‌های اصلی و وظایف آنها آشنا خواهید شد.

اکتی‌ویتی (فعالیت)

Activity[20] یا فعالیت، نامی است که به پنجره واحدی داده می‌شد که در آن کاربر می‌تواند با دستگاه تعامل داشته باشد. بدلیل اینکه یک برنامه اندرویدی بصورت تمام صفحه (full screen) و در یک فضای محدود اجراء می‌شود، ” اکتی‌ویتی“ نامی است که به یک پنجره برنامه داده می‌شود تا نمایانگر این باشد که در این پنجره کاربر فقط بر روی یک فعالیت خاص تمرکز دارد.

همچنین در سیستم اندروید رویکرد محدود کردن هر صفحه به یک پنجره (یا فعالیت) باعث می‌شود تا برنامه‌ها بتوانند با مخلوط کردن اکتی‌ویتی‌های برنامه‌های دیگر از قابلیتهای آنها استفاده کنند. برای مثال در دستگاه اندرویدی شما، برنامه ایمیل می‌تواند اکتی‌ویتی فهرست تماس‌ها (contact) را احظار کند تا کاربر از میان این لیست یک نفر را برای فرستادن ایمیل انتخاب کند. استفاده مجدد از اکتی‌ویتی‌ برنامه‌های دیگر باعث می‌شود تا کُد کمتری نوشته، و یکپارچگی سیستم نیز حفظ شود. شما در بخش ”اهداف“ یادخواهید گرفت که چگونه برنامه‌ها می‌توانند با یکدیگر ارتباط برقرار کرده و از اکتی‌ویتی‌های یکدیگر استفاده کنند.

تقریباً کلیه اکتی‌ویتی‌ها نیاز دارند تا با کاربر تعامل برقرار کنند، و به همین دلیل، این اکتی‌ویتی است که وظیفه ایجاد پنجره و چیدمان اجزاء واسط کاربر (UI)[21] در آن پنجره را برعهده دارد. در فصل 4 شما درباره انواع مختلف کامپوننت‌های UI مطالبی را خواهید آموخت.

ایجاد یک اکتی‌ویتی

همانطور که در لیست 1-3 نشان داده شده، شما بسادگی میتوانید با منشعب کردن یک کلاس جدید از کلاس android.app.Activity[22] یک اکتی‌ویتی جدید ایجاد کنید.

لیست 1-3. ایجاد یک اکتی‌ویتی جدید

package com.apress.helloworld;

import android.app.Activity;

public class MyActivity extends Activity {

}

اعلان یک اکتی‌ویتی

منشعب کردن یک کلاس از کلاس Activity بطور خودکار باعث نمی‌شود تا اکتی‌ویتی جدید برای شما قابل استفاده باشد. بدلیل اینکه اکتی‌ویتی‌ها نقش‌های متفاوتی را در یک برنامه برعهده دارند، اندروید به برخی از فراداده‌ها (meta information) درباره این اکتی‌ویتی جدید نیاز دارد. این فراداده‌ها باید بعنوان بخشی از فایل اعلانیه اندروید (Android manifest file)، که یک فایل XML است، در تَگ[23]  <activity>[24] ارائه شوند (به لیست 2-3 نگاه کنید).

لیست 2-3. اعلان یک اکتی‌ویتی جدید در فایل AndroidManifest.xml.

 

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.apress.helloworld" >

  <application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MyActivity"

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>

همانطور که در لیست 2-3 دیده می‌شود، تگ <activity> با گرفتن نام اکتی‌ویتی، عنوان، و اینکه چگونه باید برای کاربر نمایش داده شود، اکتی‌ویتی جدیدی را اعلان می‌کند.

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

منظور از چرخهِ حیات یک اکتی‌ویتی مجموعه‌ حالت‌هایی است که یک اکتی‌ویتی از زمانی که  ایجاد می‌شود تا زمانی که نابود می‌شود به خود می‌گیرد.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

چرخهِ حیات یک برنامه اندروید نسبت به یک برنامه معمولی PC به مراتب پیچیده‌تر است. چرخه حیات یک برنامه PC مستقیماً تحت کنترل کاربر قرار دارد (یعنی هر وقت کاربر بخواهد می‌تواند آنرا شروع کند یا خاتمه دهد). ولی در اندروید، به منظور بهینه‌سازیِ استفاده از منابع، این سیستم عامل است که چرخه حیات اجزاء مختلف را مدیریت می‌کند.

یک اکتی‌ویتی در طول حیات خود از هفت مرحله عبور می‌کند. اکتی‌ویتی با استفاده از مِتد‌های بدام‌اندازی (hook) که در کلاس Activity تعریف شده‌اند از وضعیت فعلی خود آگاه می‌شود. هنگامی که وضعیت یک اکتی‌ویتی تغییر می‌کند، برنامه‌نویس با بازنویسی (override) این مِتدها می‌تواند عمل مورد نظر خود را حاصل کند. این متدها در لیست 3-3 نشان داده شده‌اند.

لیست 3-3. مِتُدهای بدام‌اندازی چرخه حیاط یک اکتی‌ویتی می‌توانند توسط برنامه‌نویس دوباره بازنویسی شوند

public class MyActivity extends Activity {

protected void onCreate(Bundle savedInstanceState);

protected void onStart();

protected void onRestart();

protected void onResume();

protected void onPause();

protected void onStop();

protected void onDestroy();

}

شکل 1-3 ترتیب فراخوانی این متدها توسط سیستم اندروید را در زمانی که اکتی‌ویتی حالت‌های مختلفی را در چرخه حیات به خود می‌گیرد نشان می‌دهد.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image011.png

شکل 1-3. ماشینِ حالت (state machine) چرخه حیات یک اکتی‌ویتی

 

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

به خاطر داشته باشید که در هنگام بازنویسی متدهای تغییرِ حالت، ابتدا متدهای کلاس منشعب شده (super class)[25] را فراخوانی کنید. در صورتی که اینکار را نکنید ممکن است در طول اجرای برنامه خطاهای پیش‌بینی نشده‌ای رخ دهد.

 

·       متد onCreate هنگام ساخته شدن اکتی‌ویتی فراخوانده می‌شود. کلیه اکتی‌ویتی‌ها به منظور مقداردهی اولیهِ اکتی‌ویتی و رابط کاربری آن (UI)، این مِتُد را پیاده سازی (implement) می‌کنند. این متد همچنین یک شیء از نوع android.os.Bundle[26] را بعنوان پارامتر می‌گیرد که ممکن است حاوی حالت منجمد شده این اکتی‌ویتی از اجرای قبلی آن باشد. در این مرحله هنوز اکتی‌ویتی برای کاربر مرئی نشده.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

در اندروید برای حمل داده‌ها میان اکتی‌ویتی‌ها، سرویس‌ها، و حتی برنامه‌ها از یک bundle (بسته) استفاده می‌شود. این یک ساختار اطلاعاتی (construct) از نوع نگاشت (map) است که داده‌ها را بصورت جفت‌های کلید/مقدار (key/value) در خود نگاه می‌دارد. این داده‌ها توسط سیستم عامل اندروید بصورت جریانی از بایت‌ها بصورت سریال‌شده (serialized) در خواهند آمد و هنگامی که نیاز به خوانده شدن آنها باشد از حالت سریال‌شده درخواهد (deserialized) آمد و به اشیاء مناسب تبدیل می‌شوند. این نوع داده‌ها در سیستم اندروید به Parcel[27] (به معنای بسته) شناخته می‌شوند.

 

·       متد onStart هنگامی فراخوانده می‌شود که اکتی‌ویتی برای کاربر مرئی می‌شود. هرچند در این مرحله اکتی‌ویتی نمایان است، ولی هنوز تا وقتی برنامه به جلوصحنه (foregrounded) نیامده کاربر نمی‌تواند با آن تعامل داشته باشد.

·       متد onResume هنگامی فراخوانی می‌شود که اکتی‌ویتی در جلوصحنه قرار داشته باشد. در این حالت، کاربر می‌تواند با برنامه تعامل داشته باشد.

·       متد onPause هنگامی فراخوانی می‌شود که برنامه دیگر در جلوصحنه قرار نداشته باشد. بدلیل اینکه ممکن است کاربر به برنامه بازنگردد، در این مرحله انتظار میرود که اکتی‌ویتی حالت فعلی خود را در یک bundle ذخیره کند.

·       متد onStop هنگامی فراخوانی می‌شود که دیگر اکتی‌ویتی برای کاربر مرئی نباشد.

·       متد onRestart درصورتی فراخوانی می‌شود که اکتی‌ویتی دوباره مرئی شود. پس از آن متد onStart فراخوانی می‌شود.

·       متد onDestroy هنگامی فراخوانی می‌شود که سیستم اندروید بخواهد اکتی‌ویتی را نابود (destroy) کند.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

بعد از بازگشت متدهای onStop  یا onDestroy، ممکن است در هر زمان سیستم عامل اندروید تصمیم بگیرد تا برنامه را بِکُشد (kill). از برنامه‌ها انتظار می‌رود در طول فراخوانی متد onPause حالت فعلی خود را ذخیره کنند.

 

...........................................

برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.

 

فصل 4

منابع برنامه

یکی از مهمترین اجزاء یک برنامه را منابع تشکیل می‌دهند. به منظور اینکه ثبات برنامه حفظ شود، و همچنین بدلیل اینکه ممکن است به یک منبع بطور مکرر و در جاهای مختلف رجوع شود، پس به منظور اینکه از تکرار اختصاص منابع جلوگیری شود بهتر است همیشه منابع از  کد برنامه جدا نگاه داشته شوند. اینکار فواید زیادی دارد، از جمله:

·       بومی‌سازی (Localization) برنامه: برنامه‌ها می‌توانند‌ برای هر زبانی از منبع جداگانه‌ای استفاده کنند. بسته به منابع موجود، کاربر می‌تواند در زمان اجراء برنامه زبان متفاوتی را برای آن انتخاب کند. این باعث می‌شود تا بتوان برای یک برنامه واحد امکان بومی‌سازی و پشتیبانی از چندین زبان را در فراهم آورد.

·       ظاهر متفاوت در دستگاه‌های مختلف: بدلیل اینکه سیستم اندروید وابسته به دستگاه خاصی نیست، هیچ تنظیمی وجود ندارد که رابطِ کاربرِ کلیه دستگاه‌های اندرویدی یکسان بنظر برسد. برای تغییر و سفارشی کردن (customize) صفحه، از الگو‌ها و تصاویری استفاده می‌شود که به اندازهِ صفحه و تراکم (density) نقاط آن بستگی دارند. جداسازی منابع برنامه از کُد آن باعث می‌شود تا برنامه بتواند از  منابع مختلفی استفاده کند که نوع آنها به خصوصیات دستگاه (مثلاً اندازه صفحه و غیره) بستگی دارد.

سیستم اندروید مجموعه کاملی از APIها و ساختارها (structure) را در اختیار برنامه نویس قرار می‌دهد تا بتواند منابع را سازماندهی کند و برحسب ویژگی‌های دستگاه، و یا محیط حین‌ِ اجراء برنامه، بتواند از میان آنها منبع مناسب را انتخاب کرده و بکار بگیرد.

در بخش‌های آتی به ساختار منابع و همچنین چگونگی دسترسی به آنها از طریق APIها خواهیم پرداخت.

ساختار منابع

کیت توسعه نرم‌افزار اندروید (SDK) برنامه‌ها را ملزم می‌کند که منابع خود را در فولدر خاصی، یعنی در زیردایرکتوری /src/main/res، قرار دهند. همانگونه که در لیست 1-4 نشان داده شده، این برنامه دارای یک منبع تصویری بنام icon.png است، که در دایرکتوری drawable قرادارد. یک فایل الگویی، بنام main.xml، نیز در دایرکتوری layout قراردارد. همچنین یک منبع رشته‌ای بنام strings.xml نیز در دایرکتوری values قرار دارد.

لیست 1-4. ساختار منابع برنامه

Hello Android

     |

     `- src

         `- main

             `- res

                 |- drawable

                 |     `- icon.png

                 |

                 |- layout

                 |     `- main.xml

                 |

                 `- values

                       `- strings.xml

نامگذاری صحیح دایرکتوری منابع اهمیت زیادی دارد. درصورتی که منابع دارای نام صحیحی نباشند اندروید قادر به پیدا کردن آنها نیست.

سیستم اندروید بصورت خودکار کلیه ساب‌دایرکتوری‌های منابع را ایجاد نمی‌کند. شما می‌توانید هر زمان که بخواهید آنهایی را که ایجاد نشده‌اند بصورت دستی ایجاد کنید، به این صورت که ابتدا روی دایرکتوری res راست-کلیک کرده و از منوی ظاهر شده مورد
New  Android Resource Directory را انتخاب می‌کنید تا پنجره‌ای مانند آنچه در شکل 1-4 نشان داده شده برای شما ظاهر شود.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image012.jpg

شکل 1-4. دیالوگ مربوط به ساخت دایرکتوری برای یک منبع جدید

گروه‌بندی منابع مختلف

بسته به نوع منابع، اندروید آنها را به 9 دسته اصلی گروه‌بندی می‌کند. هر یک از این 9 گروه ساب‌دایرکتوری مربوط به خود را دارد که در دایرکتوری منابع (یعنی src/res) قرار می‌گیرند. هنگامی که شما برنامه خود را کامپایل کردید و برنامه ساخته شد، زنجیره ابزار اندروید بصورت خودکار یک فایلِ کلاسِ جاوا بنام  R.>نام پکیج برنامه< (مثلاً com.apress.R) را ایجاد می‌کند تا از این طریق بتوانید در کدِ برنامه به منابع دسترسی پیدا کنید. در جدول 1-4 فهرستی از این 9 گروه، به همراه نام زیردایرکتوری آنها، و گروه آنها در درون کلاس ثابت‌های R آمده است.

جدول 1-4. گروه‌های منابع، زیردایرکتوری آنها، نام ثابت R آنها، و پیشوند XML مربوط به آنها

 گروه منبع

زیردایرکتوری

رجوع در کد

XML رجوع در  

انیمیشن‌های نوع property

animator

R.animator

@animator/<file>

انیمیشن‌های نوع Tween

anim

R.anim

@anim/<file>

فهرست رنگها

color

R.color

@color/<file>

تصاویر قابل‌نمایش

drawable

R.drawable

@drawable/<file>

الگوها

layout

R.layout

@layout/<file>

منو‌ها

menu

R.menu

@menu/<file>

داده‌های خام

raw

R.raw

 

داده‌های ساده

values

R.arrays

 

 

 

R.bool

@bool/<id>

 

 

R.color

@color/<id>

 

 

R.dimen

@dimen/<id>

 

 

R.integer

@integer/<id>

 

 

R.string

@string/<id>

 

 

R.style

@style/<id>

داده‌های XML

xml

R.xml

 

 

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

درصورتی که نتوانستید منبع مورد نظر خود را در کلاس R پیدا کنید، مطمئن شوید که کلاس R مناسب را در کد برنامه وارد (import) کرده‌اید. منابع مربوط به سیستم نیز در کلاس android.R قرار دارند و ممکن است ناخوسته توسط اندروید استودیو به کد برنامه شما وارد شده باشند.

منابع انیمیشن‌های  نوع property

منابع انیمیشن‌های نوع property[28] آن دسته از انیمیشن‌هایی را تعریف می‌کند که می‌توان با تعیین خاصه‌های (properties) انیمیشن مشخص کرد که آنها در یک زمان مشخص و در طی یک مدت زمان معین چگونه روی صفحه به حرکت در خواهند آمد. همانگونه که در لیست 2-4 نشان داده شده، این منابع بصورت فایل‌های XML هستند که خاصه‌های انیمیشن‌ها در آنها تعریف شده است. اندروید انتظار دارد تا این فایل‌ها در دایرکتوری src/res/animator قرار داده شوند.

لیست 2-4. فایل منبع src/res/animator/example.xml که در آن خواص یک انیمیشن نوع property تعریف شده است

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android=

    "http://schemas.android.com/apk/res/android">

    <objectAnimator android:propertyName="x"

        android:duration="1000"

        android:valueFrom="10"

        android:valueTo="100"

        android:valueType="intType" />

</set>

هنگامی که این خواص تعیین شدند، همانطور که در لیست 3-4 نشان داده شده، منبع مورد نظر می‌تواند در کدِ برنامه از طریق >نام فایل منبع R.animator.< مورد دسترسی قرار گیرد. در اینجا ”نام فایل منبع“ بعنوان شناسه منبع مورد استفاده قرار می‌گیرد.

لیست 3-4. استفاده از منبع انیمیشن در کدِ برنامه

AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(

        this, R.animator.example);

منابع انیمیشن‌های نوع Tween

منابع انیمیشن‌های نوع Tween[29] آن دسته انیمیشن‌هایی را تعریف می‌کند که با اعمال یک سری تبدیلات ساده بر روی محتوای آنها میتوان مشخص کرد که چگونه به حرکت درمی‌آیند. همانگونه که در لیست 4-4 نشان داده شده، این منابع نیز بصورت فایل‌های XML هستند که در دایرکتوری src/res/anim قرار داده می‌شوند. از ”نام فایل منبع“ بعنوان شناسه منبع استفاده می‌شود.

لیست 4-4. فایل منبع انیمیشن  src/res/anim/twin.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android=

    "http://schemas.android.com/apk/res/android">

    <scale android:fromXScale="1.0"

        android:toXScale="2.0"

        android:duration="1000" />

    <rotate android:fromDegrees="0"

        android:toDegrees="180"

        android:duration="1000" />

</set>

همانطور که در لیست 5-4 نشان داده شده، منبع می‌تواند در کدِ برنامه از طریق >نام فایل منبع R.anim.< مورد دسترسی قرار گیرد.

لیست 5-4. استفاده از فایل منبع نوع Tween

TextView textView = (TextView) findViewById(R.id.hello_world);

Animation animation = AnimationUtils.loadAnimation(

        this, R.anim.tween);

textView.startAnimation(animation);

 

...........................................

برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.

فصل 5

الگوها و نماها

سیستم اندروید مجموعه جامعی از رابط‌های کاربری (UI) را برای برنامه‌های موبایل فراهم آورده. در این فصل ما به مباحثی همچون الگوهای ایستا و پویا، اجزاء رابط کاربریِ ورودی و خروجی، و همچنین API مربوط به قطعه‌ها خواهیم پرداخت که برای توسعه رابط‌های کاربری پودمانی (modular) از آنها استفاده می‌شود. از این به بعد هرجا از UI نام برده شد، منظور از آن همان رابطِ کاربر است.

الگوها

در سیستم عامل اندروید، ساختار ظاهری UI برنامه‌ها توسط الگوها (Layouts) تعریف می‌شود. هر الگو زیر کلاسی از کلاس ViewGroup است. هر الگو می‌تواند حاوی نماهای (Views) منفرد و همچنین دیگر اجزای ViewGroup باشد. یک الگو بعنوان یک ViewGroup، مسئولیت مشخص کردن مکان، و همچنین نمایش، اعضای آن در صحنه را بر عهده دارد.

اعلان الگوها

سیستم اندروید از دو روش برای اعلان الگو و اعضای آن استفاده می‌کند.

·       استفاده از منابع XML. در این روش الگو و اعضای آن می‌توانند بصورت XML تعریف شوند (یعنی در داخل منابعی تعریف می‌شوند که به فرمت عادی XML هستند). این رویکرد باعث می‌شود تا شکل ظاهری (presentation) برنامه از چگونگی عملکرد (business logic) آن مجزا شود. بدلیل اینکه اندروید قادر است از صفحاتی با اندازه‌ها و تراکم‌های متفاوت پشتیبانی کند، تنها کاری که برنامه باید انجام دهد این است که برای هر نوع صفحه یک الگوی XML متفاوت را فراهم آورد و نیاز نیست برای هر صفحه تغییری در کد برنامه داده شود.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

اندروید استودیو ابزارهای بصری لازم را در اختیار برنامه نویس قرار داده. از این ابزارها می‌توان برای ایجاد و تغییر الگوهای مختلف را در طول توسعه برنامه استفاده کرد.

·       از طریق کُد برنامه و استفاده از APIهای مربوطه. سیستم اندروید کلاس‌های میانجی و متدهایی را فراهم آورد که توسط آنها براحتی می‌توان الگوها و اعضای آن را از درون کدِ برنامه اعلان، و یا آنها را دستکاری، کرد.

به منظور سهولت بیشتر، کلمات استفاده شده برای اعلان الگوها در XML، و آنهایی که در API برنامه بکار می‌روند تا اندازه زیادی شبیه یکدیگرند.

هر چند برای اعلان الگوها می‌توان از هر دو رویکرد استفاده کرد، ولی توصیه ما این است که برای تعریف رابط کاربری اندروید از منابع XML استفاده کنید، مگر اینکه بدلیل نیازهای خاصی  که برنامه دارد، نشود از این روش استفاده کرد.

الزامات یک الگو

به منظور اینکه الگوها بطور صحیحی عمل کنند، لازم است تا اندازه فرزندان خود را بدانند، از جمله Viewها و اعضای ViewGroup  تو در تو (nested). به همین دلیل نیاز است تا کلیه اعضای View و ViewGroup دو خاصه زیر را تعریف کنند:

·       android:layout_width: که پهنای عضو را مشخص می‌کند.

·       android:layout_height: که ارتفاع عضو را مشخص می‌کند.

پهنا و ارتفاع هم می‌توانند یک اندازه عددی به خود بگیرند، و هم می‌توانند دو مقدار ثابت زیر را بگیرند که بسته به شرایط، اندازه آنها را تغییر می‌دهد. این مقادیر ثابت عبارتند از:

·       matchParent: در این حالت نماها می‌خواهند به بزرگی والد (parent) خود باشند.

·       wrapContent: در این حالت نماها فقط می‌خواهند آنقدر بزرگ باشند که محتوای جاری خود را در بر گیرند.

الگوهای معمول

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

الگوی خطی

الگوی خطی (LinearLayout)[30] اعضای خود را بشکل خطی، و به صورت ستون‌های عمودی و یا به صورت سطرهای افقی، در کنار یکدیگر قرار می‌دهد. برای نمونه به شکل 1-5 نگاه کنید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image013.jpg

شکل 1-5. الگوی خطی، با اعضایی که بصورت افقی و عمودی درکنار یکدیگر چیده شده‌اند

جهت یک الگوی خطی

همانطور که در لیست 1-5 نشان داده شده، خاصه android:orientation[31] مربوط به عضو LinearLayout می‌تواند جهت (عمودی یا افقی) یک الگوی خطی را تعیین کند.

لیست 1-5.  یک الگوی خطی که جهت آن عمودی قرار داده شده

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

...

</LinearLayout>

خاصه android:orientation می‌تواند یکی از دو مقدار زیر را داشته باشد:

·       horizontal: اعضا بصورت یک سطر افقی پشت سر هم قرار می‌گیرند.

·       Vertical: اعضا بصورت یک ستون عمودی به دنبال هم قرار می‌گیرند.

اگر خاصه android:orientation مشخص نشده باشد، حالت پیش‌فرض برای الگوی خطی horizontal است.

وزن اعضای یک الگوی خطی

براساس اندازه صفحه و جهت آن، یک LinearLayout اندازه اعضای فرزند خود را طوری تنظیم می‌کند که فضای قابل‌استفاده را پُر کنند. اینکار بصورت خودکار باعث می‌شود تا رابطِ کاربر بتواند خود را با صفحاتی که اندازه‌ متفاوت، و یا جهت متفاوت، دارند وفق دهد.

بطور پیش‌فرض فضا به طور مساوی میان اعضای فرزند توزیع می‌شود؛ ولی همانطور که در لیست 2-5 نشان داده شده، با استفاده از خاصه (android:layout_weight)[32] می‌توان وزن متفاوتی را برای هر عضو فرزند در نظر گرفت.

لیست 2-5. یک LinearLayout که نخستین عضو آن نسبت به بقیه وزن بیشتری را دارا است

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal">

<Button

android:id="@+id/button_1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="@string/button_1"/>

<Button

android:id="@+id/button_2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/button_2"/>

</LinearLayout>

همانطور که در شکل 2-5 نشان داده شده، دارا بودن وزن بیشتر باعث می‌شود تا عضو فرزند بتواند گسترش یابد و نسبت به اعضایی که وزن پایینتری دارند فضای بیشتری را پر کند.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image014.jpg

شکل 2-5. یک LinearLayout که نخستین عضو آن وزن بیشتری داشته و فضای بیشتری را اشغال کرده

درصورتی که برای عضو فرزند هیچگونه android:layout_weight مشخص نشده باشد، مقدار پیش‌فرض برای آن 0 است.

گرانی اعضای یک الگوی خطی

به طور پیش‌فرض، یک LinearLayout فرزندان خود را بر حسب لبه بالایی آنها چیده و با  یکدیگر هم‌تراز می‌کند. خاصه android:layout_gravity[33] می‌تواند این رفتار پیش‌فرض را تغییر دهد. خاصه android:layout_gravity می‌تواند برای تعیین موقیت یک نما، یک یا چندین مقدار را به خود بگیرد.

مقادیر پشیبانی شده در جهت افقی

در حالتی که جهت الگوی خطی افقی باشند از مقادیر زیر پشتیبانی می‌شود:

·       top: نما را در بالای والد آن قرار میدهد.

·       center_vertical: نما را در وسطِ عمودی والدِ آن قرار می‌دهد.

·       bottom: نما را در پایین والد آن قرار میدهد.

مقادیر پشیبانی شده در جهت عمودی

در حالتی که جهت الگو عمودی باشند از مقادیر زیر پشتیبانی می‌شود:

·       left: نما را در سمت چپِ والد آن قرار میدهد.

·       center_horizontal: نما را در وسطِ افقی والدِ آن قرار می‌دهد.

·       right: نما را در سمت راستِ والد آن قرار میدهد.

الگوهای نسبی

تقریباً می‌توان کلیه UIها را با استفاده از چندین الگوی خطی، که به صورت تودرتو چیده شده‌اند، طراحی کرد؛ ولی اینکار همچنین باعث می‌شود که الگوی نهایی خیلی پیچیده‌تر شده و تغییر و نگهداری آن مشکل شود. به همین منظور سیستم اندروید الگوی نسبی، یا RelativeLayout[34]، را برای برنامه‌نویسان فراهم آورده تا بدون اینکه نیازی به الگوهای خطی تو در تو باشد، بتوانند رابط‌های کاربری پیچیده را طراحی کنند. برای نمونه به شکل 3-5 نگاه کنید.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image015.jpg

شکل 3-5. یک الگوی نسبی (RelativeLayout)، با عضوهایی که به صورت نسبی قرار گرفته‌اند

یک الگوی نسبی اعضای خود را به شکل نسبی مرتب می‌کند. موقعیت هر عضو فرزند می‌تواند نسبت به عضوهای اطرافش، و یا والدش، مشخص شود. همانطور که در لیست 3-5 نشان داده شده، هر عضو از یک RelativeLayout دارای یک یا چند خاصه است که روی هم رفته چگونگی قرار گرفتن این عضو در صفحه را مشخص می‌کنند.

لیست 3-5. یک RelativeLayout با اعضایی که موقعیت نسبی خود را مشخص کرده‌اند

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:padding="20dp">

<EditText

android:id="@+id/edit_username"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_alignParentEnd="true"

android:layout_toEndOf="@+id/label_username" />

<TextView

android:id="@+id/label_username"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBaseline="@id/edit_username"

android:text="Username:" />

 

<Button

android:id="@+id/button_login"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/edit_username"

android:layout_alignLeft="@id/edit_username"

android:text="Login" />

<CheckBox

android:id="@+id/checkbox_remember_username"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/edit_username"

android:layout_alignParentRight="true"

android:layout_alignBottom="@id/button_login"

android:text="Remember username?" />

</RelativeLayout>

موقعیت قرارگیری نسبت به یک نمای گیرداده شده

خاصه‌های مربوط به RelativeLayout که در زیر آمده، موقعیت یک نما را نسبت به یک نمای گیر داده شده (anchor View)[35] مشخص می‌کند:

·        android:layout_above: لبه پایینی را در بالای گیره تعیین شده قرار می‌دهد.

·       android:layout_alignBaseline: خطِ ‌مبنا (baseline) را روی خط مبنای نمای گیرداده شده قرار می‌دهد.

·       android:layout_alignBottom: لبه پایین را طوری قرار می‌دهد که با نمای گیرداده شده تطابق داشته باشد.

·       android:layout_alignEnd: لبه پایانی را طوری قرار می‌دهد که با نمای گیرداده شده تطابق داشته باشد.

·        android:layout_alignLeft: لبه چَپ را طوری قرار می‌دهد که با نمای گیرداده شده تطابق داشته باشد.

·       android:layout_alignRight: لبه راست را طوری قرار می‌دهد که با نمای گیرداده شده تطابق داشته باشد.

·       android:layout_alignStart: لبه شروع را طوری قرار می‌دهد که با نمای گیرداده شده تطابق داشته باشد.

·       android:layout_alignTop: لبه بالا را طوری قرار می‌دهد که با نمای گیرداده شده تطابق داشته باشد.

·       android:layout_below: لبه بالا را در زیر نمای گیر داده شده قرار می‌دهد.

·       android:layout_toEndOf: لبه شروع را طوری قرار می‌دهد که با لبه پایانی نمای گیر داده شده تطابق داشته باشد.

·       android:layout_toLeftOf: لبه راست را طوری قرار می‌دهد که با لبه چپِ نمای گیر داده شده تطابق داشته باشد.

·       android:layout_toRightOf: لبه چپ را طوری قرار می‌دهد که با لبه راستِ نمای گیر داده شده تطابق داشته باشد.

·       android:layout_toStartOf: لبه پایان را طوری قرار می‌دهد که با لبه شروع نمای گیر داده شده تطابق داشته باشد.

موقعیت قرارگیری نسبت به نمای والد

خاصه‌های مربوط به RelativeLayout که در زیر آمده، موقعیت یک نما را نسبت به نمای والد آن مشخص می‌کند:

·       android:layout_alignParentBottom: لبه پایین را طوری قرار می‌دهد که با نمای والد تطابق داشته باشد.

·       android:layout_alignParentEnd: لبه پایانی را طوری قرار می‌دهد که با نمای والد تطابق داشته باشد.

·       android:layout_alignParentLeft: لبه چپ را طوری قرار می‌دهد که با نمای والد تطابق داشته باشد.

·       android:layout_alignParentRight: لبه راست را طوری قرار می‌دهد که با نمای والد تطابق داشته باشد.

·       android:layout_alignParentStart: لبه شروع را طوری قرار می‌دهد که با نمای والد تطابق داشته باشد.

·        android:layout_alignParentTop: لبه بالا را طوری قرار می‌دهد که با نمای والد تطابق داشته باشد.

·       android:layout_centerHorizontal: اگر مقدار این خاصه true باشد، آنگاه این نما بطور افقی در وسط والدش قرار می‌گیرد.

·       android:layout_centerInParent: اگر مقدار این خاصه true باشد، آنگاه این نما هم بطور افقی و هم بطور عمودی در وسط والدش قرار می‌گیرد.

·       android:layout_centerVertical: اگر مقدار این خاصه true باشد، آنگاه این نما بطور عمودی در وسط والدش قرار می‌گیرد.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image016.png

در حالتی که نمای گیر داده شده نامریی باشد، آنگاه می‌توان مقدار خاصه android: layout_align WithParent IfMissing  را true قرارداد تا در مواقعی که نمای گیرداده شده پیدا نباشد از والد بعنوان گیره استفاده شود.

 

...........................................

برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.

فصل 6

رابط کاربر

اگرچه همه برنامه‌های اندرویدی بصورت تمام-صفحه اجراء می‌شوند، با این حال هنوز هم سیستم اندروید برخی از ویژگی‌های پنجره مانند، مثل نوار فعالیت، پنجره‌های زودگذر، دیالوگ‌ها، و اخطار دهنده‌ها، را در دسترس قرار می‌دهد. ما در این فصل مروری خواهیم داشت بر روی این ویژگی‌های پنجره مانند. هرچند که همه برنامه‌های اندرویدی از دیالوگ‌ها و پنجره‌های زودگذر استفاده نمی‌کنند، ولی تقریباً همه برنامه‌ها از نوار فعالیت و اخطار دهنده‌ها استفاده می‌کنند تا برای کاربر یک تجربه‌ هموار و ثابت را مهیا کنند.

نوار فعالیت

سیستم اندروید از طریق نوار فعالیت (Action Bar)[36] ویژگی‌های پنجره‌مانندی را فراهم می‌کند که به کاربر کمک می‌کند بداند چه برنامه‌ای درحال اجراء است، و یا موقعیت او را در برنامه مشخص کند، و یا اینکه بداند فعالیت‌های مهم برنامه کدام‌ها هستند و چگونه می‌توان میان آنها حرکت کرد.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image003.png

آیکُنی که در سمت راست نوار فعالیت قرار دارد و سه نقطه عمودی را نشان می‌دهند، به منوی سرریز (overflow menu) شناخته می‌شود. هنگامی که روی آن کلیک می‌شود، یک منوی پایین رونده را نمایش می‌دهد که در آن فهرستی از فعالیت‌هایی که بطور مستقیم در نوار فعالیت دیده نمی‌شوند را برای کاربر نشان می‌دهد.

همانطور که در شکل 1-6 دیده می‌شود، نوار فعالیت شامل موارد زیر است:

·       آیکُن و عنوان برنامه.

·       آیکُن‌ها و برچسب‌های مربوط به فعالیت‌های مهم برنامه، و همچنین درصورتی که بدلیل  محدودیت نوار فعالیت، فهرست کلیه فعالیتها نتوانند در نوار جا داده شوند، یک منوی سرریز در سمت راست نوار نمایش داده می‌شود.

·       پشتیبانی از حرکت در داخل برنامه (Navigation) با استفاده از دکمه Back، tabها، و منوهای پایین‌رونده.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image017.jpg

شکل 1-6. یک نوار فعالیت و اجزاء آن

افزودن یک نوار فعالیت

برای اولین بار APIهای مربوط به نوار فعالیت در API سطح 11 معرفی شد، ولی از طریق کتابخانه پشتیبان اندروید می‌توان برای سطوح پایینتر نیز از آن استفاده کرد. با شروع API سطح 11، با استفاده از تِم (theme) پیش‌فرضTheme.Holo  می‌توان در کلیه اکتی‌ویتی‌ها به ActionBar دسترسی داشت. همانطور که در لیست 1-6 دیده می‌شود، برنامه هر زمان که بخواهد می‌تواند با فراخوانی متد getActionBar [37] از کلاس Activity به نمونه‌ای از ActionBar دسترسی پیدا کند.

لیست 1-6. گرفتن نمونه‌ای از ActionBar از اکتی‌ویتی

ActionBar actionBar = getActionBar();

برداشتن نوار فعالیت

بدلیل اینکه از هنگام ارائه API سطح 11 به بعد، برنامه بطور پیش‌فرض یک  نوار فعالیت دارد، درصورتی که برنامه نیازی به آن نداشته باشد، همانطور که در لیست 2-6 نشان داده شده، می‌تواند به آسانی با فراخوانی متد hide[38] آن را پنهان کند.

 

لیست 2-6. برداشتن نوار فعالیت

@Override

protected void onCreate(Bundle savedInstanceState) {

    ActionBar actionBar = getActionBar();

    actionBar.hide();

}

افزودن فعالیت‌ها به نوار فعالیت

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

تعریف فعالیت‌ها برای نوار فعالیت

همانطور که در لیست 3-6 نشان داده شده، فعالیتها به شکل منابعِ مِنو در دایرکتوری res/menu ذخیره می‌شوند.

لیست 3-6. محتوای فایل res/menu/menu_actions.xml

<menu xmlns:android=

        "http://schemas.android.com/apk/res/android">

 

    <item

        android:id="@+id/action_search"

        android:title="@string/action_search"

        android:icon="@drawable/ic_action_search" />

 

    <item

        android:id="@+id/action_save"

        android:title="@string/action_save"

        android:icon="@drawable/ic_action_save" />

<item android:id="@+id/action_share"

        android:title="@string/action_share"

        android:icon="@drawable/ic_action_share" />

 

    <item android:id="@+id/action_settings"

        android:title="@string/action_settings"

        android:icon="@drawable/ic_action_settings"

        android:showAsAction="never" />

 

    <item android:id="@+id/action_about"

        android:title="@string/action_about"

        android:icon="@drawable/ic_action_about"

        android:showAsAction="never" />

</menu>

هر فعالیت از طریق تَگ <item> تعریف می‌شود که دارای یک ID، یک آیکُن، و یک عنوان است. تگ <item> همچنین می‌تواند پارامترهایی را بگیرد که تعیین می‌کنند چگونه این فعالیت باید در نوار فعالیت نمایش داده شود.

 

...........................................

برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.

فصل 7

ذخیره‌سازی داده‌ها

سیستم عامل اندروید برای ذخیره سازی داده‌های برنامه چندین گزینه را فراهم آورده است.  بدلیل اینکه انتخاب این گزینه‌ها به ماهیت برنامه و کاربردهای آن بستگی دارد، هیچ گزینه‌ای در این میان نیست که از بقیه بهتر باشد. در این فصل ما مروری خواهیم داشت بر روش‌های مختلفی که سیستم اندروید برای ذخیره‌سازی داده‌ها در اختیار کاربر قرار میدهد، روش‌هایی همچون: فایل‌های ساده، اولویت‌های مشترک (shared preferences)، و پایگاه‌های داده‌ای‌ رابطه‌ای (relational database). بعداً در همین فصل مروری نیز خواهیم داشت بر سرویس پشتیبان‌گیر اندروید (Android Backup Service)، که برای پشتیبانی و بازیابی داده‌های برنامه به کلاد (cloud) از آن استفاده می‌شود تا کار ارتقاء (upgrade) و بازنشانی (reset) دستگاه‌ها یکنواخت و آسان شود.

فایل‌های ساده

مانند سیستم‌عامل‌های دیگر، در سیستم عامل اندروید نیز استفاده از فایل‌ آسان‌ترین راه برای نگهداری داده‌ها است. شما برای اینکار می‌توانید از APIهای مربوط به I/O (ورودی و خروجی)، که توسط زبان جاوا فراهم آمده، استفاده کنید. سیستم اندروید دو نوع ذخیره‌ساز را فراهم آورده: یکی ذخیره‌ساز داخلی است (که غیرقابل برداشتند) و  دیگری ذخیره‌ساز خارجی (چیزهایی مانند کارت‌های SD که براحتی می‌توان آنها را برداشت).

استفاده از ذخیره‌ساز داخلی

بطور پیش‌فرض داده‌هایی که در ذخیره‌ساز داخلی ذخیره می‌شوند فقط به برنامه‌ای اختصاص دارند که آنها را ذخیره کرده. هنگامی که برنامه نصب شده از روی دستگاه برداشته می‌شود (uninstall می‌شود)، اندروید همراه با خود برنامه، کلیه این فایل‌ها را نیز حذف می‌کند. برای ساختن یک فایل جدید در ذخیره‌ساز داخلی دستگاه میتوان از متد Context.openFileOutput[39] مربوط کانتکس جاری، مثلاً اکتی‌ویتی فعلی، استفاده کرد. همانطور که در لیست 1-7 نشان داده شده، این متد یک شیء بصورت java.io.OutputStream را بازمی‌گرداند که می‌توان برای نوشتن در یک فایل از آن استفاده کرد.

لیست 1-7. بازکردن یک فایل در ذخیره‌ساز داخلی برای الحاق داده‌ها (Appending)

try {

    FileOutputStream output =

            openFileOutput("file.dat", MODE_APPEND);

    try {

        // write to output stream

    } finally {

        output.close();

    }

} catch (IOException e) {

    e.printStackTrace();

}

متد getFileOutput دو پارامتر می‌گیرد؛ یکی نام فایلی که باید باز و یا ایجاد شود، و دیگری حالتی که فایل باید باز شود. لیستی از فلَگ‌ها (flags) که می‌توان از آن برای مشخص کردن اینکه چگونه فایلها باید توسط API باز شوند ”حالتِ فایل“ را تشکیل می‌دهند. حالتِ فایل میتواند ترکیبی از فلگ‌های زیر باشد:

·       MODE_PRIVATE: اگر هیچ حالتی ذکر نشود، این حالت پیش‌فرض است. در این حالت فقط خود برنامه‌ِ فراخوان می‌تواند به فایل دسترسی داشته باشد.

·       MODE_APPEND: درصورتی که فایل از قبل موجود است، به اندروید فرمان می‌دهد بجای اینکه آن را پاک کند، آن را در حالت الحاق باز کند.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

سیستم اندروید از حالت‌های دیگری مثل MODE_WORLD_READABLE  و MODE_WORLD_WRITABLE نیز پشتیبانی می‌کند، ولی حالا دیگر نباید از این حالت‌ها استفاده کرد. برای به اشتراک گذاری فایل‌ها با برنامه‌های دیگر، بجای آینها شما باید از مکانیزم‌های اصولی دیگری استفاده کنید (مثلاً فراهم کننده‌های محتوا).

همانطور که در لیست 2-7 نشان داده شده، شما برای خواندن یک فایل می‌توانید از متد [40]Context.openFileInput استفاده کنید.

لیست 2-7. باز کردن یک فایل در ذخیره کننده داخلی برای خواندن

File input = openFileInput("file.dat");

استفاده از ذخیره‌ کننده‌های خارجی

بدلیل اینکه در بیشتر دستگاه‌های اندرویدی ذخیره کننده داخلی فضای نسبتاً کمی دارد، ما توصیه می‌کنیم برای ذخیره فایل‌های بزرگ از ذخیره کننده خارجی استفاده کنید. در صورتی که کاربر ذخیره ساز انبوه یو.اس.بی (USB mass storage) را فعال کند تا از این طریق بتوان ذخیره کننده‌‌های خارجی را روی کامپیوتری که به دستگاه متصل می‌شود برای انتقال فایل سوار کرد (mount)، فایل‌هایی که در ذخیره کننده‌ خارجی دستگاه ذخیره شده‌اند می‌توانند توسط همه برنامه‌ها موجود در کامپیوتر مورد دستیابی قرار گیرند (هم برای خواندن و هم برای نوشتن).

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

هنگامی که ذخیره کننده‌های خارجی بصورت یک ذخیره سازی انبوه یو.اس.بی در یک کامپیوتر سوار می‌شوند، این ذخیره کننده‌ها برای برنامه‌هایی که بر روی دستگاه درحال اجرا هستند غیر قابل دستیابی می‌شوند.

دستیابی به ذخیره‌ کننده‌های خارجی

استفاده از ذخیره‌ کننده‌های خارجی برای خواندن و نوشتن فایل‌ها به مجوزهای خاصی نیاز دارد. همانطور که در لیست 3-7 نشان داده شده، برنامه باید این مجوزها را در طول نصب برنامه از طریق فایل اعلانیه درخواست کند.

لیست 3-7. اعلان درخواست مجوز برای نوشتن در ذخیره کننده خارجی در فایل اعلانیه برنامه

<uses-permission android:name=

"android.permission.WRITE_EXTERNAL_STORAGE" />

دستیابی به ذخیره کننده‌های خارجی توسط دو مجوز زیر تعیین می‌شود:

·       READ_EXTERNAL_STORAGE: برای خواندن از ذخیره کننده‌های خارجی.

·       WRITE_EXTERNAL_STORAGE: هم برای نوشتن، و هم برای خواندنِ ذخیره کننده‌های خارجی.

 

...........................................

برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.

فصل 8

حسگرها و موقعیت‌یاب‌ها

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

حسگرها

برنامه‌های اندرویدی ازطریق APIهای sensor می‌توانند حسگرهای دستگاه را زیرنظر داشته باشند تا از این طریق تجربه‌ای گیرا و کاملاً محاوره‌ای را برای کاربر فراهم کنند. برای نمونه، اغلب بازی‌ها بطور گسترده‌ای از حسگرهای دستگاه استفاده می‌کنند تا بتوانند به شکلی طبیعی از کاربر ورودی دریافت کنند. در این بخش ما APIهایی را بررسی می‌کنیم که برای تعامل با این حسگرها توسط اندروید فراهم آمده.

مدیریت حسگر

سیستم اندروید از طریق سرویس حسگر (Sensor Service) دسترسی به حسگرهای دستگاه را فراهم می‌کند. برنامه می‌تواند از طریق APIهای SensorManager[41] به سرویس حسگر دسترسی پیدا کند. همانطور که در لیست 1-8 نشان داده شده، از طریق متد getSystemService می‌توان نمونه‌ای از SensorManager را بدست آورد.

لیست 1-8. گرفتن نمونه‌ای از SensorManager

SensorManager sensorManager = (SensorManager)

        getSystemService(Context.SENSOR_SERVICE);

انواع حسگرها

اندروید از حسگرهای گوناگونی پشتیبانی می‌کند. برخی از این حسگرها دستگاه‌های سخت‌افزاری واقعی هستند که بخشی از خود دستگاه‌اند، و برخی دیگر حسگرهای مبتنی-بر نرم‌افزار هستند که اساس اندازه‌گیری آنها به ترکیبی از حسگرهای دیگر تکیه دارد. برای هر یک از این حسگرها در کلاسِ Sensor[42] مجموعهای از ثابتها تعریف شده:

·       TYPE_ACCELEROMETER: حسگر شتاب‌سنج، که شتاب را بر حسب m/s2 اندازه‌گیری می‌کند.

·       TYPE_AMBIENT_TEMPERATURE: حسگر دمای محیط، که دمای محیط را بر حسب درجه سانتی‌گراد اندازه‌گیری می‌کند.

·       TYPE_GAME_ROTATION_VECTOR: حسگرِ بردارِ چرخشِ تنظیم نشده (کالیبره نشده).

·       TYPE_GEOMAGNETIC_ROTATION_VECTOR: حسگرِ بردارِ چرخشِ هندسی.

·       TYPE_GRAVITY: حسگرِ گرانشی.

·       TYPE_GYROSCOPE: حسگرِ گردشی (ژیروسکوپ).

·       TYPE_GYROSCOPE_UNCALIBRATED: حسگرِ گردشی تنظیم نشده (کالیبره نشده).

·       TYPE_HEART_RATE: حسگرِ ضربانِ قلب.

·       TYPE_LIGHT: حسگرِ نوری.

·       TYPE_LINEAR_ACCELERATION: حسگر شتاب خطی.

·       TYPE_MAGNETIC_FIELD: حسگر میدان مغناطیسی.

·       TYPE_MAGNETIC_FIELD_UNCALIBRATED: حسگر میدان مغناطیسی تنظیم نشده.

·       TYPE_PRESSURE: حسگر فشار.

·       TYPE_PROXIMITY: حسگر مجاورت.

·       TYPE_RELATIVE_HUMIDITY: حسگر رطوبت نسبی.

·       TYPE_ROTATION_VECTOR: حسگر بردار چرخش.

·       TYPE_SIGNIFICANT_MOTION: حسگر حرکت شدید.

·       TYPE_STEP_DETECTOR: حسگر تشخیص گام.

گرفتن حسگر پیش‌فرض برای انواع حسگرها

از طریق ثابت‌های حسگر که در بالا ذکر شد، می‌توان از متد getDefaultSensor کلاسِ SensorManager استفاده کرد تا برای انواع مختلف حسگرها، حسگر پیش‌فرص را بدست آورد (لیست 2-8).

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

گرچه استفاده از اکثر حسگرها به مجوز خاصی نیاز ندارد، حسگرهای جدیدی همچون حسگر جسمی، و حسگر ضربان قلب، به مجوز android. Permission .BODY_SENSORS نیاز دارند.

 

لیست 2-8. گرفتن حسگر پیش‌فرض برای حسگر مورد نظر

Sensor sensor = sensorManager.getDefaultSensor(

        Sensor.TYPE_ACCELEROMETER);

if (sensor == null) {

    // Unable to get the sensor

} else {

    // Sensor can be used

}

گرفتن لیست کلیه حسگرها برای نوع خاصی از حسگر

متد getDefaultSensor تنها می‌تواند حسگرِ پیش‌فرضِ یک حسگر خاص را بازگرداند. درصورتی که برای یک حسگر خاص، دستگاه به بیش یک حسگر مجهز باشد، برنامه بجای متد قبلی می‌تواند از متد getSensorList[43] استفاده کند. این متد نوع حسگر مورد نظر را گرفته و لیستی از حسگرها، که با حسگر داده شده مطابقت داشته باشند را بازمی‌گرداند. همانطور که در لیست 3-8 نشان داده شده، برنامه می‌تواند این لیست را بررسی کرده و براساس ویژگی‌های آنها (مثلاً حسگر چرخشی)، یکی را که مناسب است انتخاب کند.

لیست 3-8. انتخاب یک حسگر بر اساس دقت آن

List<Sensor> sensors = sensorManager.getSensorList(

        Sensor.TYPE_ACCELEROMETER);

 

Sensor choosen = null;

 

if (sensors != null) {

    for (Sensor sensor : sensors) {

        if (choosen == null

        ||  choosen.getResolution() > sensor.getResolution()) {

            choosen = sensor;

        }

    }

}

...........................................

برای ادامه مطالعه این فصل نسخه کامل PDF کتاب را تهیه کنید.

فصل 9

رسانه‌ها و دوربین

پشتیبانی از رسانه‌ها، و دسترسی به یک دوربین تفکیک-بالا از هیجان‌انگیزترین ویژه‌گی‌های سیستم اندروید است. در برنامه‌های اندرویدی از هر دو این موارد بطور گسترده استفاده می‌شود. سر و کار داشتن با رسانه‌ها در یک دستگاه موبایل چالش‌های خاص خود را دارد، و به این منظور سیستم اندروید برای برنامه‌های چندرسانهای APIهای کاملی را تدارک دیده. در این فصل مروری کوتاهی بر روی این APIها خواهیم داشت.

مدیریت صُوت

اندروید از طریق سرویسِ android.media.AudioManager[44] دسترسی به کنترل‌های صوتی را فراهم می‌آورد. همانطور که در لیست 1-9 نشان داده شده، این سرویس می‌تواند از طریق درخواستِ سرویسِ سیستمی Context.AUDIO_SERVICE از کانتتکس جاری بدست آید.

لیست 1-9. گرفتن نمونه‌ای از AudioManager از کانتکس جاری

AudioManager audioManager = (AudioManager)

getSystemService(Context.AUDIO_SERVICE);

دستگاه‌های صوتی

دستگاه‌های اندرویدی به دستگاه‌های ورودی و خروجی صوتی، از قبیل بلندگو و میکروفون، مجهز هستند. در این نوع دستگاه‌ها، از هدفون‌های بلوتوث نیز بعنوان دستگاه‌های صوتی خارجی پشتیبانی می‌شود. کلاسِ AudioManager متدهایی را ارائه می‌کند که توسط آنها می‌توان وضعیت اینگونه دستگاه‌ها را بررسی کرد. همچنین توسط این کلاس می‌توان این دستگاه‌ها را در برنامه فعال و یا غیرفعال کرد.

میکروفون

میکروفون (Microphone) به دستگاه اندرویدی اجازه می‌دهد  تا ورودی صوتی را دریافت کند. هنگامی که به ورودی صوتی نیاز نباشد، میتوان میکروفون را صامت کرد (mute). کلاس AudioManager متدهایی را برای بررسی وضعیت فعلی میکروفون، و همچنین فعال و غیرفعال کردن آن ارائه می‌دهد.

بررسی اینکه آیا میکروفون فعال است

همانطور که در لیست 2-9 نشان داده شده، با استفاده از متد isMicrophoneMute کلاسِ AudioManager می‌توان بررسی کرد که آیا میکروفون فعال یا غیرفعال است.

لیست 2-9. بررسی اینکه میکروفون فعال است

if (audioManager.isMicrophoneMute()) {

// stop streaming audio input

}

فعال و غیر فعال کردن میکروفون

همانطور که در لیست 3-9 نشان داده شده، برنامه می‌تواند با استفاده از متد setMicrophoneMute کلاسِ AudioManager میکروفون را فعال و یا غیرفعال کند.

لیست 3-9. غیرفعال کردن میکروفون

audioManager.setMicrophoneMute(true);

بلندگو

تقریباً همه دستگاه‌های اندرویدی یک بلندگو (Speakerphone) دارند. بلندگو به کاربر اجازه می‌دهد تا بدون اینکه نیازی به چسباندن دستگاه به گوش خود داشته باشد، بتواند خروجی صوتی آن را از فاصله نزدیک بشنود. کلاس AudioManager متدهایی را برای بررسی فعال و غیرفعال بودن بلندگو، و همینطور درصورت لزوم هدایت خروجی صوتی به آن را ارائه می‌دهد.

بررسی اینکه آیا بلندگو روشن است یا نه

همانطور که در لیست 4-9 نشان داده شده، برنامه می‌تواند با استفاده از متد isSpeakerphoneOn[45] کلاس AudioManager  بررسی کند که آیا صوت از طریق بلندگو پخش می‌شود یا نه.

لیست 4-9. بررسی اینکه بلندگو روشن است یا نه

if (audioManager.isSpeakerphoneOn()) {

// disable speakerphone button

}

خاموش و روشن کردن بلندگو

همانطور که در لیست 5-9 دیده می‌شود، برای روشن و خاموش کردن بلندگو، کلاسِ AudioManager متد setSpeakerphoneOn را فراهم آورده.

لیست 5-9. خاموش و روشن کردن بلندگو

audioManager.setSpeakerphoneOn(true);

جریان‌های صوتی

اندروید بین جریان‌های صوتی (Audio Streams) مختلف بر حسب کاربرد آنها تفاوت قائل می‌شود، و اجازه می‌دهد که هر گروه از این جریان‌های صوتی بطور مستقل کنترل شوند. این باعث می‌شود تا کاربر بتواند برای اصوات متفاوت، مثل زنگ شماطه (alarm clock)، زنگ تلفن، و پخش موسیقی، سطوح مختلفی از درجه ‌صدا را تنظیم کند.

Description: Description: Description: Description: Description: Description: Description: Description: C:\Users\kami\Documents\My Books\android quick api\sum_files\image002.png

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

 


 


[1] - IPC= Inter-Process Communication.

[2] AIDL= Android Interface Definition Language برای اطلاعات بیشتر به این آدرس رجوع کنید :

http://developer.android.com/guide/components/aidl.html

[3] - همانطور که خواننده می‌داند، بدلیل اینکه دستگاه‌های موبایل به اندازه کافی برای توسعه نرم‌افزار قدرتمند نیستند، برای تولید برنامه‌های موبایل باید از کامپیوترهای رومیزی و یا لپ‌تاپ استفاده شود. حتی اگر طی روندی که امروز با آن روبرو هستیم، تا چند سال آینده دستگاه‌های موبایل به‌اندازه کامپیوترهای رومیزی امروز قدرتمند شوند، بدلیل اندازه کوچک صفحه نمایش آنها و نداشتن ابزارهایی مانند کی‌بورد و ماوس، باز هم توسعه و ساخت برنامه‌های پیچیده برروی دستگاه‌های موبایل کار راحتی نخواهد بود، مگر اینکه آنها را به صفحه نمایش‌های بزرگتر و یا صفحه کلید متصل کرد، که در اینصورت آنها دیگر شباهتی به دستگاه موبایل نخواهند داشت! البته ساخت برنامه‌های ساده در چنین دستگاه‌هایی امکان‌پذیر است (مترجم).

[4] - YAFFS2 = Yet Another Flash File System.

[5] - SSL = Secure Socket Layer

[6] - TLS =  Transport Level Security

[7] -  ART = Android Runtime

[8] - JIT= Just in Time

[9] - AOT= Ahead Of Time

[10] - DEX= Dalvik Executable

[11] - در برخی کتابها Forking به شاخه‌شاخه شدن نیز ترجمه شده (مترجم).

[12] - https://developer.android.com/about/dashboards/index.html

[13] - http://developer.android.com/tools/support-library/features.html

[14] - NDK= Native Development Kit

[15] - اصطلاح بومی در اینجا به تولید برنامه‌هایی دلالت دارد که بجای اینکه خروجی کامپایلر این برنامه‌ها بصورت بایت‌کُد باشد (مثل خروجی برنامه‌هایی که به زبان‌های Java و C# نوشته شده‌اند)، خروجی آنها بصورت کُدهای زبان ماشین است که
زبان بومی دستگاه محسوب می‌شود و پردازنده می‌تواند مستقیماً آنها را درک و پردازش کند (مترجم).

[16] - ADT= Android Development Tools

[17] - http://developer.android.com/sdk/installing/studio.html

[18] - JDK= JAvA Development Kit

[19]-  JRE= JAvA Runtime Edition  

[20] 0 Activity به معنای فعالیت است و یکی از آن اصطلاحات کم‌مایه‌ای است که به تازگی به جمع اصطلاحات کامپیوتری اضافه شده. در متن این کتاب هرجا به اکتی‌ویتی برخورد شود منظور از آن همان لغت ”فعالیت“ است، ولی بدلیل اینکه درجاهایی از متن این کتاب نیاز بوده تا از لغت فعالیت به معنای عام آن استفاده شود و این استفاده ارتباطی با معنی آن در اندروید ندارد، در اینجا ترجیح داده شده تا برای تفکیک این لغات از هم، از املای فارسی لغت ”Activity“ برای اشاره به معنی آن در اندروید استفاده شود.

[21] - UI = User Interface

[22] - http://developer.android.com/reference/android/app/Activity.html

[23] - tag

[24] - http://developer.android.com/guide/topics/manifest/activity-element.html

[25] - در فرهنگ اصطلاحات زبان جاوا به کلاسی که کلاسهای دیگر از آن منشعب می‌شود کلاس بالایی یا super class می‌گویند. (مترجم)

[26] -  http://developer.android.com/reference/android/os/Bundle.html

[27] - http://developer.android.com/reference/android/os/Parcel.html

[28] - http://developer.android.com/guide/topics/graphics/prop-animation.html

[29] - http://developer.android.com/guide/topics/graphics/view-animation.html#tween-animation

[30] - http://developer.android.com/reference/android/widget/LinearLayout.html

[31] - http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:orientation

[32] - http://developer.android.com/reference/android/widget/LinearLayoutLayoutParams.html#attr_android:layout_weight

[33]- http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html#attr_android:layout_gravity

[34] - http://developer.android.com/reference/android/widget/RelativeLayout.html

[35] - http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html

[36] - http://developer.android.com/reference/android/app/ActionBar.html

[37] - http://developer.android.com/reference/android/app/Activity.html#getActionBar()

[38] - http://developer.android.com/reference/android/app/ActionBar.html#hide()

[39] - http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,int)

[40] - http://developer.android.com/reference/android/content/Context.html#openFileInput(java.lang.String).

[41] - http://developer.android.com/reference/android/hardware/SensorManager.html

[42] - http://developer.android.com/reference/android/hardware/Sensor.html

[43] - http://developer.android.com/reference/android/hardware/SensorManager.html#getSensorList(int)

[44] - http://developer.android.com/reference/android/media/AudioManager.html

[45] - http://developer.android.com/reference/android/media/AudioManager.html#isSpeakerphoneOn()

Like: ,