اصول کاربردی

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

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

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

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

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

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

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

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

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

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

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

اجزای برنامه

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

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

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

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

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

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

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

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

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

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

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

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

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

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

سرویس‌های محدود اجرا می‌شوند زیرا برخی از برنامه‌های دیگر (یا سیستم) گفته‌اند که می‌خواهد از این سرویس استفاده کند. یک سرویس محدود یک API را برای یک فرآیند دیگر فراهم می کند و سیستم می داند که بین این فرآیندها وابستگی وجود دارد. بنابراین اگر فرآیند A به یک سرویس در فرآیند B متصل باشد، سیستم می‌داند که باید فرآیند B و سرویس آن را برای A در حال اجرا نگه دارد. چیزی که کاربر نیز به آن اهمیت می دهد.

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

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

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

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

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

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

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

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

یک گیرنده پخش به عنوان یک زیر کلاس از BroadcastReceiver پیاده سازی می شود و هر پخش به عنوان یک شی Intent تحویل داده می شود. برای اطلاعات بیشتر به کلاس BroadcastReceiver مراجعه کنید.

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

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

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

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

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

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

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

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

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

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

کامپوننت ها را فعال کنید

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

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

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

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

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

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

روش های جداگانه ای برای فعال کردن هر نوع جزء وجود دارد:

  • می‌توانید یک اکتیویتی را شروع کنید یا با ارسال یک Intent به startActivity() یا زمانی که می‌خواهید اکتیویتی به نتیجه برسد، startActivityForResult() را به آن بدهید.
  • در اندروید 5.0 (سطح API 21) و بالاتر، می‌توانید از کلاس JobScheduler برای زمان‌بندی اقدامات استفاده کنید. برای نسخه‌های قبلی اندروید، می‌توانید یک سرویس را راه‌اندازی کنید یا دستورالعمل‌های جدیدی را با ارسال یک Intent to startService() به یک سرویس در حال انجام بدهید. می توانید با ارسال یک Intent to bindService() به سرویس متصل شوید.
  • شما می توانید یک پخش را با ارسال یک Intent به روش هایی مانند sendBroadcast() یا sendOrderedBroadcast() آغاز کنید.
  • می‌توانید با فراخوانی query() در ContentResolver ، یک پرس‌وجو را برای یک ارائه‌دهنده محتوا انجام دهید.

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

فایل مانیفست

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

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

  • هر گونه مجوز کاربر مورد نیاز برنامه، مانند دسترسی به اینترنت یا دسترسی خواندن به مخاطبین کاربر را شناسایی می کند.
  • حداقل سطح API مورد نیاز برنامه را که بر اساس کدام APIهایی که برنامه استفاده می کند، اعلام می کند.
  • ویژگی‌های سخت‌افزاری و نرم‌افزاری مورد استفاده یا مورد نیاز برنامه، مانند دوربین، خدمات بلوتوث یا صفحه نمایش چندلمسی را اعلام می‌کند.
  • کتابخانه‌های 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() در سیستم ثبت کرد.

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

قابلیت های جزء را اعلام کنید

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

احتیاط: اگر از یک intent برای راه اندازی یک Service استفاده می کنید، با استفاده از یک هدف صریح مطمئن شوید که برنامه شما ایمن است. استفاده از یک قصد ضمنی برای شروع یک سرویس یک خطر امنیتی است، زیرا نمی توانید مطمئن باشید که چه سرویسی به این هدف پاسخ می دهد و کاربر نمی تواند ببیند کدام سرویس شروع می شود. با شروع Android 5.0 (سطح API 21)، اگر شما bindService() با یک هدف ضمنی فراخوانی کنید، سیستم یک استثنا ایجاد می کند. فیلترهای هدف را برای خدمات خود اعلام نکنید.

سیستم اجزایی را شناسایی می کند که می توانند به یک intent با مقایسه هدف دریافت شده با فیلترهای intent ارائه شده در فایل مانیفست سایر برنامه های دستگاه پاسخ دهند.

وقتی فعالیتی را در مانیفست برنامه خود اعلام می‌کنید، می‌توانید به صورت اختیاری فیلترهای هدف را اضافه کنید که قابلیت‌های فعالیت را اعلام می‌کنند تا بتواند به اهداف برنامه‌های دیگر پاسخ دهد. شما این کار را با افزودن یک عنصر <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 یک intent ایجاد کند و آن را به startActivity() منتقل کند، ممکن است سیستم فعالیت شما را شروع کند تا کاربر بتواند پیش‌نویس و ارسال ایمیل بفرستد.

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

الزامات برنامه را اعلام کنید

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

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

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

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

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

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

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

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

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

منابع برنامه

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

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

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

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

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

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

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

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

منابع اضافی

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

ادامه مطلب در مورد:

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

همچنین مورد علاقه:

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