اصول برنامه

برنامه‌های Android را می‌توان بااستفاده از Kotlin، زبان برنامه‌نویسی Java، و زبان‌های C++‎ نوشت. ابزارهای کیت توسعه نرم‌افزار Android کد شما را به‌همراه هرگونه داده و فایل منبع در یک APK یا Android App Bundle کامپایل می‌کنند.

بسته Android، که فایل بایگانی با پسوند .apk است، حاوی محتوای برنامه Android موردنیاز در زمان اجرا است و فایلی است که دستگاه‌های مجهز به Android برای نصب برنامه از آن استفاده می‌کنند.

«بسته ترکیبی برنامه Android» که فایل بایگانی با پسوند .aab است، حاوی محتوای پروژه برنامه Android است، ازجمله برخی فراداده‌های اضافی که در زمان اجرا موردنیاز نیست. AAB قالب انتشار است و نمی‌توان آن را در دستگاه‌های Android نصب کرد. این ابزار تولید و امضای APK را به مرحله بعدی موکول می‌کند.

برای مثال، هنگام توزیع برنامه‌تان ازطریق Google Play، سرورهای Google Play فایل‌های APK بهینه‌شده‌ای تولید می‌کنند که فقط حاوی منابع و کدهایی هستند که دستگاه خاص درخواست‌کننده نصب برنامه به آن‌ها نیاز دارد.

هر برنامه Android در جعبه شنی امنیتی خودش قرار دارد و با ویژگی‌های امنیتی Android زیر محافظت می‌شود:

  • سیستم‌عامل Android یک سیستم Linux چندکاربره است که در آن هر برنامه یک کاربر متفاوت است.
  • به‌طور پیش‌فرض، سیستم به هر برنامه یک شناسه کاربر Linux یکتا اختصاص می‌دهد که فقط توسط سیستم استفاده می‌شود و برای برنامه ناشناخته است. سیستم برای همه فایل‌های موجود در برنامه اجازه‌هایی تنظیم می‌کند تا فقط شناسه کاربر اختصاص‌داده‌شده به آن برنامه بتواند به آن‌ها دسترسی داشته باشد.
  • هر فرایند ماشین مجازی (VM) خودش را دارد، بنابراین کد برنامه به‌صورت مجزا از برنامه‌های دیگر اجرا می‌شود.
  • به‌طور پیش‌فرض، هر برنامه در فرایند Linux خودش اجرا می‌شود. سیستم Android وقتی هرکدام از مؤلفه‌های برنامه باید اجرا شود، فرایند را شروع می‌کند و وقتی دیگر به آن نیاز نباشد یا وقتی سیستم باید حافظه را برای برنامه‌های دیگر بازیابی کند، فرایند را متوقف می‌کند.

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

بااین‌حال، روش‌هایی وجود دارد که برنامه بتواند داده‌ها را با برنامه‌های دیگر هم‌رسانی کند و به سرویس‌های سیستم دسترسی پیدا کند:

  • می‌توان ترتیبی داد که دو برنامه از شناسه کاربر Linux یکسانی استفاده کنند، که در این صورت می‌توانند به فایل‌های یکدیگر دسترسی داشته باشند. برای حفظ منابع سیستم، برنامه‌هایی که شناسه کاربر یکسانی دارند می‌توانند به‌گونه‌ای تنظیم شوند که در یک فرایند Linux اجرا شوند و از یک VM مشترک استفاده کنند. برنامه‌ها باید با گواهی یکسانی امضا شده باشند.
  • برنامه می‌تواند برای دسترسی به داده‌های دستگاه، مثل مکان دستگاه، دوربین، و اتصال بلوتوث، درخواست اجازه کند. کاربر باید این اجازه‌ها را به‌طور صریح اعطا کند. برای اطلاعات بیشتر درباره اجازه‌ها، اجازه‌ها در Android را ببینید.

بقیه این سند مفاهیم زیر را معرفی می‌کند:

  • مؤلفه‌های چارچوب اصلی که برنامه‌تان را تعریف می‌کند.
  • فایل مانیفست که در آن اجزا و ویژگی‌های دستگاه موردنیاز برای برنامه‌تان را اعلام می‌کنید.
  • منابعی که از کد برنامه جدا هستند و به برنامه شما اجازه می‌دهند رفتارش را به‌طور مناسب برای انواع پیکربندی‌های دستگاه بهینه‌سازی کند.

مؤلفه‌های برنامه

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

چهار نوع مؤلفه برنامه وجود دارد:

  • فعالیت‌ها
  • خدمات
  • گیرنده‌های رویداد ثبت‌شده
  • ارائه‌دهندگان محتوا

هر نوع هدف متمایزی دارد و چرخه حیات متمایزی دارد که نحوه ایجاد و نابودی مؤلفه را تعریف می‌کند. بخش‌های زیر چهار نوع مؤلفه برنامه را شرح می‌دهند.

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

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

فعالیت، تعاملات کلیدی زیر را بین سیستم و برنامه تسهیل می‌کند:

  • پیگیری آنچه کاربر درحال‌حاضر به آن اهمیت می‌دهد (آنچه روی صفحه است) تا سیستم به اجرای فرایندی که میزبان فعالیت است ادامه دهد.
  • دانستن اینکه کدام فرایندهای قبلاً استفاده‌شده حاوی فعالیت‌های متوقف‌شده‌ای هستند که ممکن است کاربر به آن‌ها بازگردد و اولویت‌بندی بالاتر این فرایندها برای دردسترس نگه داشتن آن‌ها.
  • کمک به برنامه برای مدیریت توقف فرایند آن تا کاربر بتواند به فعالیت‌ها برگردد و وضعیت قبلی آن‌ها بازیابی شود.
  • روشی برای برنامه‌ها فراهم می‌کند تا جریان‌های کاربر را بین یکدیگر پیاده‌سازی کنند و سیستم بتواند این جریان‌ها را هماهنگ کند. نمونه اصلی این مورد هم‌رسانی است.

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

سرویس‌ها
سرویس نقطه ورودی با هدف کلی برای حفظ اجرای برنامه در پس‌زمینه به دلایل مختلف است. این مؤلفه‌ای است که در پس‌زمینه اجرا می‌شود تا عملیات طولانی‌مدت را انجام دهد یا برای فرایندهای از راه دور کار کند. سرویس میانای کاربر ارائه نمی‌دهد.

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

دو نوع سرویس وجود دارد که به سیستم می‌گوید چگونه برنامه را مدیریت کند: سرویس‌های شروع‌شده و سرویس‌های محدودکننده.

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

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

خدمات محدودکننده اجرا می‌شوند زیرا برنامه دیگری (یا سیستم) اعلام کرده است که می‌خواهد از این سرویس استفاده کند. یک سرویس محدودکننده یک API را به فرایند دیگری ارائه می‌دهد و سیستم می‌داند که وابستگی بین این فرایندها وجود دارد. بنابراین اگر فرایند «الف» به سرویسی در فرایند «ب» محدود باشد، سیستم می‌داند که باید فرایند «ب» و سرویس آن را برای «الف» درحال اجرا نگه دارد. علاوه‌براین، اگر فرایند الف چیزی باشد که کاربر به آن اهمیت می‌دهد، پس می‌داند که باید با فرایند ب نیز به‌عنوان چیزی که کاربر به آن اهمیت می‌دهد رفتار کند.

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

سرویس به‌عنوان زیرکلاس Service پیاده‌سازی می‌شود. برای اطلاعات بیشتر درباره کلاس Service، به نمای کلی سرویس‌ها مراجعه کنید.

توجه: اگر برنامه شما Android 5.0 (سطح میانای برنامه‌سازی کاربردی ۲۱) یا بالاتر را هدف قرار می‌دهد، از کلاس JobScheduler برای زمان‌بندی کنش‌ها استفاده کنید. JobScheduler این مزیت را دارد که با زمان‌بندی بهینه کارها برای کاهش مصرف برق و با کار کردن با Doze API، باتری را حفظ می‌کند. برای اطلاعات بیشتر درباره استفاده از این کلاس، به JobScheduler اسناد مرجع مراجعه کنید.

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

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

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

اگرچه گیرنده‌های رویداد ثبت‌شده میانای کاربر را نمایش نمی‌دهند، اما می‌توانند اعلان نوار وضعیت ایجاد کنند تا هنگام وقوع رویداد ثبت‌شده به کاربر هشدار دهند. اما معمولاً گیرنده رویداد ثبت‌شده فقط دروازه‌ای به مؤلفه‌های دیگر است و برای انجام مقدار بسیار کمی کار درنظر گرفته شده است.

برای مثال، گیرنده رویداد ثبت‌شده ممکن است JobService را برای انجام کاری براساس رویدادی بااستفاده از JobScheduler زمان‌بندی کند. گیرنده‌های رویداد ثبت‌شده اغلب شامل برنامه‌هایی می‌شوند که با یکدیگر تعامل دارند، بنابراین مهم است که هنگام راه‌اندازی آن‌ها از پیامدهای امنیتی آگاه باشید.

گیرنده رویداد ثبت‌شده به‌عنوان زیرکلاس BroadcastReceiver پیاده‌سازی می‌شود، و هر رویداد ثبت‌شده به‌عنوان شیء Intent ارائه می‌شود. برای اطلاعات بیشتر، کلاس BroadcastReceiver را ببینید.

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

برای مثال، سیستم Android ارائه‌دهنده محتوایی را ارائه می‌دهد که اطلاعات تماس کاربر را مدیریت می‌کند. هر برنامه‌ای با اجازه‌های مناسب می‌تواند ارائه‌دهنده محتوا را جستجو کند، مثلاً بااستفاده از ContactsContract.Data، برای خواندن و نوشتن اطلاعات درباره فردی خاص.

It is tempting to think of a content provider as an abstraction on a database, because there is a lot of API and support built in to them for that common case. بااین‌حال، از دیدگاه طراحی سیستم، هدف اصلی متفاوتی دارند.

برای سیستم، ارائه‌دهنده محتوا نقطه ورودی به برنامه برای انتشار موارد داده نام‌گذاری‌شده است، که با طرح‌واره URI شناسایی می‌شود. بنابراین، برنامه می‌تواند تصمیم بگیرد که چگونه می‌خواهد داده‌های موجود در خود را به یک فضای نام URI نگاشت کند و آن URIها را به نهادهای دیگری که می‌توانند به‌نوبه خود از آن‌ها برای دسترسی به داده‌ها استفاده کنند، ارائه دهد. این مجوز به سیستم اجازه می‌دهد چند کار خاص را در مدیریت برنامه انجام دهد:

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

ارائه‌دهندگان محتوا همچنین برای خواندن و نوشتن داده‌هایی که برای برنامه شما خصوصی هستند و هم‌رسانی نمی‌شوند مفیدند.

ارائه‌دهنده محتوا به‌عنوان زیرکلاس ContentProvider پیاده‌سازی می‌شود و باید مجموعه استانداردی از میاناهای برنامه‌سازی کاربردی را پیاده‌سازی کند که به برنامه‌های دیگر امکان می‌دهد تراکنش انجام دهند. برای اطلاعات بیشتر، راهنمای توسعه‌دهنده ارائه‌دهندگان محتوا را ببینید.

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

وقتی سیستم مؤلفه‌ای را شروع می‌کند، فرایند آن برنامه را شروع می‌کند، اگر ازقبل درحال اجرا نباشد، و کلاس‌های موردنیاز برای مؤلفه را نمونه‌سازی می‌کند. برای مثال، اگر برنامه‌تان فعالیتی را در برنامه دوربین شروع کند که عکس می‌گیرد، آن فعالیت در فرایندی اجرا می‌شود که متعلق به برنامه دوربین است، نه در فرایند برنامه‌تان. بنابراین، برخلاف برنامه‌ها در اکثر سیستم‌های دیگر، برنامه‌های Android یک نقطه ورودی واحد ندارند: تابع main() وجود ندارد.

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

فعال کردن مؤلفه‌ها

پیام ناهمگامی به‌نام intent سه نوع از چهار نوع مؤلفه را فعال می‌کند: فعالیت‌ها، سرویس‌ها، و گیرنده‌های رویداد ثبت‌شده. «قصدها» مؤلفه‌های تکی را در زمان اجرا به یکدیگر متصل می‌کنند. می‌توانید آن‌ها را به‌عنوان پیام‌رسان‌هایی درنظر بگیرید که کنشی را از مؤلفه‌های دیگر درخواست می‌کنند، خواه این مؤلفه متعلق به برنامه شما باشد یا برنامه دیگری.

هدف با شیء Intent ایجاد می‌شود که پیامی را برای فعال کردن مؤلفه‌ای خاص (هدف صریح) یا نوع خاصی از مؤلفه (هدف ضمنی) تعریف می‌کند.

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

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

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

برخلاف فعالیت‌ها، سرویس‌ها، و گیرنده‌های رویداد ثبت‌شده، ارائه‌دهندگان محتوا زمانی فعال می‌شوند که هدف درخواستی از ContentResolver قرار بگیرند. حل‌کننده محتوا همه تراکنش‌های مستقیم با ارائه‌دهنده محتوا را مدیریت می‌کند و مؤلفه‌ای که تراکنش‌ها را با ارائه‌دهنده انجام می‌دهد، روش‌ها را در شیء ContentResolver فراخوانی می‌کند. این کار به‌دلایل امنیتی لایه‌ای از انتزاع بین ارائه‌دهنده محتوا و مؤلفه درخواست‌کننده اطلاعات ایجاد می‌کند.

روش‌های جداگانه‌ای برای فعال کردن هر نوع مؤلفه وجود دارد:

  • می‌توانید فعالیتی را شروع کنید یا با ارسال Intent به startActivity()، کار جدیدی به آن بدهید یا وقتی می‌خواهید فعالیت نتیجه‌ای را برگرداند، startActivityForResult().
  • در Android نسخه ۵.۰ (سطح میانای برنامه‌سازی کاربردی ۲۱) و بالاتر، می‌توانید از کلاس JobScheduler برای زمان‌بندی کنش‌ها استفاده کنید. برای نسخه‌های قدیمی‌تر Android، می‌توانید با ارسال Intent به startService()، سرویسی را شروع کنید یا دستورالعمل‌های جدیدی به سرویس درحال اجرا بدهید. می‌توانید با ارسال Intent به bindService() به سرویس متصل شوید.
  • می‌توانید با ارسال Intent به روش‌هایی مثل sendBroadcast() یا sendOrderedBroadcast()، همه‌فرستی را شروع کنید.
  • می‌توانید با فراخوانی query() در ContentResolver، از ارائه‌دهنده محتوا پرس‌وجو کنید.

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

فایل مانیفست

پیش‌از اینکه سیستم Android بتواند مؤلفه برنامه را شروع کند، سیستم باید با خواندن فایل مانیفست برنامه، AndroidManifest.xml، از وجود مؤلفه مطلع شود. برنامه شما همه مؤلفه‌هایش را در این فایل اعلام می‌کند که در ریشه دایرکتوری پروژه برنامه قرار دارد.

مانیفست علاوه‌بر اعلام مؤلفه‌های برنامه، کارهای دیگری نیز انجام می‌دهد، ازجمله موارد زیر:

  • هرگونه اجازه کاربری را که برنامه نیاز دارد، مثل دسترسی به اینترنت یا دسترسی خواندن به مخاطبین کاربر، شناسایی می‌کند.
  • حداقل سطح API موردنیاز برنامه را براساس APIهایی که برنامه استفاده می‌کند اعلام می‌کند.
  • ویژگی‌های سخت‌افزاری و نرم‌افزاری مورداستفاده یا موردنیاز برنامه را اعلام می‌کند، مثل دوربین، سرویس‌های بلوتوث، یا صفحه چندلمسی.
  • کتابخانه‌های میانای برنامه‌سازی کاربردی را که برنامه باید به آن‌ها پیوند داده شود (به‌غیراز میاناهای برنامه‌سازی کاربردی چارچوب Android) اعلام می‌کند، مثل کتابخانه Google Maps.

اعلام کردن مؤلفه‌ها

وظیفه اصلی مانیفست این است که سیستم را از مؤلفه‌های برنامه مطلع کند. برای مثال، فایل مانیفست می‌تواند فعالیتی را به‌صورت زیر اعلام کند:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

در عنصر <application>، مشخصه android:icon به منابعی برای نمادی اشاره می‌کند که برنامه را شناسایی می‌کند.

در عنصر <activity>، مشخصه android:name نام کلاس کاملاً واجدشرایط زیرکلاس Activity را مشخص می‌کند، و مشخصه android:label رشته‌ای را مشخص می‌کند که به‌عنوان برچسب قابل‌مشاهده برای کاربر برای فعالیت استفاده می‌شود.

باید همه مؤلفه‌های برنامه را بااستفاده از عناصر زیر اعلام کنید:

  • <activity> عنصر برای فعالیت‌ها
  • ‫<service> عنصر برای خدمات
  • ‫<receiver> عنصر برای گیرنده‌های رویداد ثبت‌شده
  • <provider> عنصر برای ارائه‌دهندگان محتوا

فعالیت‌ها، سرویس‌ها، و ارائه‌دهندگان محتوایی که در منبع خود اضافه می‌کنید اما در مانیفست اعلام نمی‌کنید برای سیستم قابل‌مشاهده نیستند و درنتیجه هرگز اجرا نمی‌شوند. بااین‌حال، گیرنده‌های رویداد ثبت‌شده را می‌توان در مانیفست اعلام کرد یا به‌صورت پویا در کد به‌عنوان اشیاء BroadcastReceiver ایجاد کرد و با فراخوانی registerReceiver() در سیستم ثبت کرد.

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

اعلام قابلیت‌های مؤلفه

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

احتیاط: اگر از قصد برای شروع Service استفاده می‌کنید، مطمئن شوید که برنامه‌تان بااستفاده از قصد صریح ایمن است. استفاده از قصد ضمنی برای شروع سرویس یک خطر امنیتی است، زیرا نمی‌توانید مطمئن باشید که کدام سرویس به قصد پاسخ می‌دهد و کاربر نمی‌تواند ببیند کدام سرویس شروع می‌شود. از Android نسخه ۵.۰ (سطح میانای برنامه‌سازی کاربردی ۲۱)، اگر bindService() را با هدف ضمنی فراخوانی کنید، سیستم استثنایی را ایجاد می‌کند. فیلترهای قصد را برای سرویس‌هایتان اعلام نکنید.

سیستم با مقایسه قصد دریافتی با فیلترهای قصد ارائه‌شده در فایل مانیفست سایر برنامه‌های موجود در دستگاه، مؤلفه‌هایی را که می‌توانند به قصد پاسخ دهند شناسایی می‌کند.

وقتی فعالیتی را در مانیفست برنامه‌تان اعلام می‌کنید، می‌توانید به‌طور اختیاری فیلترهای قصدی را اضافه کنید که قابلیت‌های فعالیت را اعلام می‌کنند تا بتواند به قصدها از برنامه‌های دیگر پاسخ دهد. این کار را با افزودن عنصر <intent-filter> به‌عنوان فرزند عنصر اعلام مؤلفه انجام می‌دهید.

برای مثال، اگر برنامه ایمیلی با فعالیتی برای نوشتن ایمیل جدید بسازید، می‌توانید فیلتر قصدی را برای پاسخ دادن به قصد «ارسال» برای ارسال ایمیل جدید اعلام کنید، همان‌طور که در مثال زیر نشان داده شده است:

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

اگر برنامه دیگری قصدی با کنش ACTION_SEND ایجاد کند و آن را به startActivity() ارسال کند، سیستم ممکن است فعالیت شما را شروع کند تا کاربر بتواند ایمیلی پیش‌نویس و ارسال کند.

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

اعلام الزامات برنامه

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

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

برای مثال، فرض کنید برنامه‌تان به دوربین نیاز دارد و از میاناهای برنامه‌سازی کاربردی معرفی‌شده در Android 8.0 (میانای برنامه‌سازی کاربردی سطح ۲۶) استفاده می‌کند. باید این الزامات را اعلام کنید. مقادیر minSdkVersion و targetSdkVersion در فایل build.gradle واحد برنامه شما تنظیم شده است:

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 26
    targetSdkVersion 29
  }
}

توجه: minSdkVersion و targetSdkVersion را مستقیماً در فایل مانیفست تنظیم نکنید، زیرا این مقادیر درطول فرایند ساخت توسط Gradle بازنویسی می‌شوند. برای اطلاعات بیشتر، مشخص کردن الزامات سطح میانای برنامه‌سازی کاربردی را ببینید.

ویژگی دوربین را در فایل مانیفست برنامه‌تان اعلام می‌کنید:

<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    ...
</manifest>

با اظهارنامه‌های نشان‌داده‌شده در این مثال‌ها، دستگاه‌هایی که دوربین ندارند یا نسخه Android آن‌ها پایین‌تر از ۸.۰ است نمی‌توانند برنامه‌تان را از Google Play نصب کنند. بااین‌حال، می‌توانید اعلام کنید که برنامه‌تان از دوربین استفاده می‌کند، اما به آن نیاز ندارد. برای انجام این کار، مشخصه required را روی false تنظیم می‌کنید، در زمان اجرا بررسی می‌کنید که آیا دستگاه دوربین دارد یا نه، و درصورت نیاز، ویژگی‌های دوربین را غیرفعال می‌کنید.

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

منابع برنامه

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

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

برای هر منبعی که در پروژه Android خود اضافه می‌کنید، ابزارهای ساخت کیت توسعه نرم‌افزار یک شناسه عدد صحیح یکتا تعریف می‌کنند که می‌توانید از آن برای ارجاع به منبع از کد برنامه خود یا از منابع دیگری که در XML تعریف شده‌اند استفاده کنید. برای مثال، اگر برنامه‌تان حاوی فایل تصویری‌ای به‌نام logo.png (ذخیره‌شده در دایرکتوری res/drawable/) باشد، ابزارهای کیت توسعه نرم‌افزار شناسه منبعی به‌نام R.drawable.logo تولید می‌کنند. این شناسه به یک عدد صحیح مختص برنامه نگاشت می‌شود که می‌توانید از آن برای ارجاع به تصویر و درج آن در میانای کاربر استفاده کنید.

یکی از مهم‌ترین جنبه‌های ارائه منابع جدا از کد منبع، توانایی ارائه منابع جایگزین برای پیکربندی‌های مختلف دستگاه است.

برای مثال، با تعریف رشته‌های واسط کاربر در XML، می‌توانید رشته‌ها را به زبان‌های دیگر ترجمه کنید و آن رشته‌ها را در فایل‌های جداگانه ذخیره کنید. سپس Android رشته‌های زبانی مناسب را براساس توصیف‌گر زبانی که به نام فهرست راهنمای منبع اضافه می‌کنید (مثلاً res/values-fr/ برای مقادیر رشته فرانسوی) و تنظیمات زبان کاربر، در واسط کاربر شما اعمال می‌کند.

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

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

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

منابع بیشتر

برای یادگیری توسعه Android بااستفاده از ویدیوها و آموزش‌های کد، دوره Udacity توسعه برنامه‌های Android با Kotlin را ببینید.

ادامه خواندن درباره:

قصدها و فیلترهای قصد
با نحوه استفاده از Intent API برای فعال کردن مؤلفه‌های برنامه، مانند فعالیت‌ها و سرویس‌ها، و نحوه دردسترس قرار دادن مؤلفه‌های برنامه برای استفاده توسط برنامه‌های دیگر آشنا شوید.
مقدمه‌ای بر فعالیت‌ها
با نحوه ایجاد نمونه‌ای از کلاس Activity آشنا شوید، که صفحه‌ای متمایز با میانای کاربر در برنامه‌تان ارائه می‌دهد.
نمای کلی منابع برنامه
با نحوه ساختاردهی برنامه‌های Android برای جدا کردن منابع برنامه از کد برنامه آشنا شوید، ازجمله اینکه چگونه می‌توانید منابع جایگزین برای پیکربندی‌های خاص دستگاه ارائه دهید.

همچنین جالب است:

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