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

اجزای برنامه های کاربردی (application component ) بلوک های ضروری یک برنامه اندرویدی هستند. هر جزء یا کامپوننت به منظور خاصی برای تعامل با سیستم عامل ایجاد شده است و رفتارهای یک برنامه رت تحت تاثیر قرار می دهند. درک جزئیات این کامپوننت ها در انجام تست نفوذ بسیار مهم است، زیرا هر برنامه حداقل یکی از این اجزا را خواهد داشت. چند کامپوننت از کامپوننت های اندروید در تصویر زیر نشان داده شده اند و همه کامپوننت های اندرویدی بوسیله intent ها با هم ارتباط برقرار می کنند.

Activity :

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

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

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

 

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

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

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

در زیر حالت های مختلف در یک چرخه حیات اکتیویتی آمده است :

  • اجرا شدن اکتیویتی : زمانی که کاربر برنامه ای را با ضربه زدن بر روی آیکون آن اجرا می کند، است.
  • حالت creat : نمونه ای جدید از اکتیویتی ایجاد می شود و متد onCreate() فقط یک بار برای هر اکتیویتی اجرا می شود.
  • حالت start : اکتیویتی اصلی برنامه با متد onstart() ایجاد و به کاربر نشان داده می شود. اکتیویتی ای که بر روی صفحه نمایش است در حالت running قرار می گیرد.
  • حالت Paused : هنگامی که اکتیویتی مورد نظر دیگر مورد توجه و تعامل با کاربر نمی باشد، اما هنوز روی صفحه نمایش قابل مشاهده است، در وضعیت paused شده قراردارد.
  • حالت Resumed : هنگامی که کاربر دوباره شروع می کند به تعامل با اکتیویتی ای که در حال حاضر روی صفحه نمایش است، اکتیویتی با متد onResume() به حالت Resumed رفته و اجرا می شود.
  • حالت Stopped : اکتیویتی که روی صفحه نمایش قابل مشاهده نیست، اما در حافظه وجود دارد در وضعیت stopped شده است. یک اکتیویتی با اجرا شدن متد onstop() متوقف شده و تمام منابعی که در اختیار داشته را آزاد می کند. البته با فراخوانی شدن متد onRestart() دوباره بر روی صفحه نمایش نشان داده می شود و می تواند دوباره در حالت start قرار بگیرد.
  • حالت Destroyed : در این حالت یک اکتیویتی در نتیجه حذف یک اکتیویتی (که دیگر نیاز نیست) از حافظه است. ، نابود می شود و تمام منابعی هم که با قرار گرفتن در حالت stop آزاد نشده بود، آزاد می شوند. چنین انتقال هایی معمولا زمانی اتفاق می افتد که activity manager مطمئن شود که دیگر از چنین اکتیویتی هایی استفاده نمی شود.

 

Service :

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

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

سرویس ها 3 نوع هستند:

  • Foreground :

یک سرویس پیش زمینه برخی از عملیات را که برای کاربر قابل توجه (noticeable) است،اجرا می کند. برای مثال برنامه رادیو از یک سرویس پیش زمینه برای پخش استفاده می کند. سرویس های پیش زمینه باید اعلان (Notification) نشان دهند و به کار خود حتی زمانی که کاربر با برنامه تعامل ندارد، ادامه دهند.

  • Background :

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

  • Bound :

یک سرویس زمانی bound (متصل) می شود که یک کامپوننت برنامه کاربردی آن را بوسیله فراخوانی متد bindService() ، متصل کرده باشد. یک سرویس bound شده یک رابط مشتری-سرور فراهم می کند که اجزای سازنده را قادر می سازد تا با سرویس ها ارتباط برقرار کنند، درخواست ارسال کنند، نتایج را دریافت کنند و تا زمانی اجرا می شوند که یک کامپوننت از برنامه کاربردی به آن bound شده باشد. در نتیجه زمانی که همه کامپوننت های متصل شده به یک سرویس unbind می شوند آن سرویس از بین می رود.

همه سرویس های مورد استفاده در برنامه باید در فایل مانیفست (manifest) برنامه، همانطور که اکتیویتی ها و دیگر کامپوننت ها را معرفی می شوند، معرفی شوند. برای نمونه به تصویر زیر دقت نمائید.

 

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

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

  • Starting
  • Running
  • Destroyed

 

Content Provider :

در اندروید شما نمی توانید داده های یک برنامه را با یک دیگر به دلیل محدودیت های اعمال شده توسط سیستم عامل به اشتراک بگذارید. Content Provider (ارائه دهنده محتوا) برای به اشتراک گذاشتن داده ها بین برنامه های کاربردی استفاده می شود. برای مثال یک برنامه شبکه اجتماعی مانند تلگرام که به لیست مخاطبان، موقعیت مکانی و پیامک ها دسترسی پیدا می کند. بر خلاف دیگر کامپوننت های برنامه های کاربردی، خواندن از یا نوشتن در Content Provider ها می تواند با استفاده از permission ها محدود و کنترل شود.

برای درک بهتر این موضوع یک مثال از یک برنامه شبکه اجتماعی را بررسی می کنیم. اگر شما بخواهید یک تصویر در صفحه شخصی خودتان آپلود کنید، با لمس کردن دکمه آپلود تصویر، گالری تصاویر شما باز می شود و می توانید تصویر مورد نظر را برای آپلود انتخاب کنید. در واقع صفحه شخصی شما یک ACTIVITY است که با لمس کردن دکمه آپلود تصویر، CONTENT PROVIDER ( گالری تصاویر ) باز می شود و تصویر با استفاده از SERVICE آپلود شبکه، آپلود می شود.

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

عملیاتی که توسط یک content provider پشتیبانی می شود عبارتند از:

  • Querying : از content provider برای همه ی object ها برمبنای URI ای مشخص query می گیرد.
  • Delete : یک object مشخص از پایگاه داده ی content provider حذف می کند.
  • Update : object های موجود در پایگاه داده را به روز رسانی می کند.
  • Insert : object جدیدی را در پایگاه داده درج می کند.

ارائه دهنده محتوا بسیار شبیه یک پایگاه داده است که در آن شما می توانید از آن query بگیرید ، محتوای آن را ویرایش کنید، و همچنین با استفاده از متدهای inserter ()، update ()، delete() و  query() می توانید محتویات را اضافه و یا حذف کنید و در بیشتر موارد این اطلاعات در پایگاه داده SQlite ذخیره می شود.

عملیاتی که توسط یک content provider پشتیبانی می شود عبارتند از:

  • Querying : از content provider برای همه ی object ها برمبنای URI ای مشخص query می گیرد.
  • Delete : یک object مشخص از پایگاه داده ی content provider حذف می کند.
  • Updateتمام object های موجود در پایگاه داده را به روز رسانی می کند.
  • Insert تمام object جدیدی را در پایگاه داده درج می کند.

برای query گرفتن از یک Content Provider باید query خود را به فرمت یک URI که ادامه بررسی می شود بنویسید:

<prefix>://<authority>/<data_type>/<id>

Prefix : همیشه content:// تنظیم می شود.

Authority: این قسمت نام content provider مشخص می شود برای مثال به صورت contacts یا browser و یا به صورت com.android.contacts و یا com.instagram.android می باشد.

data_type: این قسمت نشان دهنده نوع داده هایی است که این content provider خاص ارائه می دهد. به عنوان مثال، اگر همه مخاطبین را از ارائه دهنده محتوای contacts دریافت می کنید، مسیر داده ها people هستند و URI مانند content://contacts/people خواهد بود.

Id: این قسمت به رکورد خاصی اشاره دارد.برای مثال اگر به دنبال مخاطب شماره 5 در content provider هستید URI مربوطه به صورت content://contacts/people/5 می شود.

 

Broadcast Receiver :

یک broadcast receiver  یک کامپوننت اندوروید است که  به رویدادهای سیستم که broadcast  نامیده می شود، پاسخ می دهد. به عبارت دیگر، کار Broadcast Receiver ارسال اعلان ها به کاربر به هنگام وقوع یک رویداد می باشد. broadcast  ها می توانند توسط سیستم تولید شده باشند (برای مثال، اعلام تغییر در اتصال شبکه) و یا توسط یک برنامه ی کاربردی تولید شود (برای مثال، اعلام اینکه به روزرسانی داده ها در پس زمینه کامل شد).

با استفاده از یک Broadcast Receiver، برنامه ها می توانند برای یک رویداد خاص register کنند. هنگامی که رویداد رخ می دهد، سیستم به تمام برنامه های register شده اعلام می کند.

برای مثال، یک Broadcast receiver اعلان کم بودن باتری که شما روی صفحه نمایش موبایل خود مشاهده می کنید را فعال می کند ویا پست های جدید، دنبال کننده های جدید و پیام های جدید در برنامه های شبکه اجتماعی و یا پیام رسان ها را اعلان می کند و در اعلان هایی مانند incoming message ها، پیام های WiFi Activated/Deactivated نیز نقش ایفا می کند. در حقیقت، Broadcast receiver ها اطلاعیه هایی real-time  در مورد آنچه که در سیستم اندروید و برنامه ها اتفاق می افتد، می باشند.

 

Intent :

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

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

گاهی اوقات، Intent ها برای اطلاع رسانی به سیستم اندروید در مورد وقوع یک رویداد تعریف می شوند و این دقیقا همان چیزی است که در مورد Broadcast Receiver ها رخ می دهد برای مثال، intent ای برای اعلام کم بودن میزان باتری به کاربر تعریف می شود.

 

گردآورنده و مترجم : مریم مکاریان خراسانی

 

منابع:

  • Mobile Application Penetration Testing,Copyright © 2016,Vijay Kumar Velu,Published by Packt Publishing Ltd.
  • Android Security Internal, Copyright© 2015, Nikolay Elenkov, Published by No Starch Press Inc.
  • https://www.edureka.co/blog/android-tutorials-for-beginners-activity-component/
  • https://www.edureka.co/blog/interview-questions/android-interview-questions-answers-for-beginners/.
  • https://www.edureka.co/blog/beginners-guide-android-architecture/
  • https://developer.android.com/guide/components/services
  • https://www.edureka.co/blog/android-tutorials-beginners-service-component/
  • https://www.edureka.co/blog/beginner-android-tutorials-content-provider/
  • https://www.tutorialspoint.com/android/android_content_providers.htm
  • https://www.edureka.co/blog/android-tutorials-broadcast-receivers/
  • http://beyamooz.com/android/4339-components-of-a-application