أعلان الهيدر

الرئيسية توضيح مكونات تطبيق الأندرويد

توضيح مكونات تطبيق الأندرويد



تطوير تطبيقات أندرويد هو أحد أوائل توجهات المطورين الجدد؛ فالكثير من الجامعات تقوم بتعليم جافا لذا من الطبيعي أن يكون توجههم, ولكنني حقا اتفاجأ من أعداد الناس اللذين لا يعلمون أساسيات هذا المجال رغم وصفهم لأنفسهم كمطوري أندرويد. أحد تلك الأساسيات هي أنواع مكونات التطبيقات في أندرويد, فما لا يعلمه البعض هو انه بامكانك بناء تطبيق أندرويد يعمل بالكامل دون إستعمال أي Activity فيه.

ما هي مكونات تطبيقات الأندرويد

مكونات تطبيقات الاندرويد هي الحجر الاساسي لبناء أي تطبيق أندرويد, حيث لا يمكننا تسمية التطبيق ب”تطبيق أندرويد” اذا لم يحتوي أياً منها. تنقسم مكونات تطبيقات أندرويد الى اربعة أنواع:
  • Activity
  • Service
  • Broadcast Receiver
  • Content Provider
كل نوع له دورة حياة خاصة ويمكن ربطها ببعض وجميعها يجب تعريفها مكوناتها في ملف AndroidManifest.xml اذا وجدت في البرنامج. في هذا المقال سأعطي توضيحاً ولكن لن أتطرق لكيفية برمجتها, فقط أريدك أن تعرفها وتعرف متى تحتاجها.

Activity

إن سبق لك برمجة تطبيق أندرويد فحتما تعرف ما هي Activity. يمكن تعريفها على أنها الواجهة التي يتفاعل معها المستخدم, كل مكون ينتمي الى Activity يمثل واجهة واحدة ويحتوي فقط على ما يراه المستخدم في الشاشة. مثلا تطبيق الايميل قد يحتوي Activity تعرض قائمة بالايميلات الواردة, و Activity أخرى تعرض امكانية كتابة رسالة جديدة. رغم ان الواجهات داخل التطبيقات قد تبدو مترابطة ببعضها من وجهة نظر المستخدم, إلّا أن كل Activity منعزلة عن الاخرى, فيمكن للمطور أن يجعل برنامجه يبدأ من أي Activity اذا اراد ذلك, مثلا بامكان المطور ان يجعل ال Activity التي تحوي واجهة قائمة الايميلات الواردة هي الواجهة التي ستفتح عند الضغط على التطبيق, بينما ال Activity التي تحوي واجهة كتابة رسالة جديدة هي الواجهة التي ستفتح عندما يختار المستخدم زر المشاركة مع تطبيقه.
من الممكن “بل ومن الشائع” أن يكون Activity هو النوع الوحيد المستعمل في التطبيق, ولكن بقية الأنواع لها استعمالاتها وفوائدها الخاصة أيضا.

Service

لشرحه فعلي طرح المثال الأشهر له “تطبيق مشغل الموسيقى”, عندما يقوم المستخدم بتشغيل أغنية من التطبيق فهو حتما سيريد من الموسيقى أن تستمر حتى بعد خروجه من التطبيق أو أغلاق الجهاز؛ هذا يعني أن المطور عليه أن يجعل تطبيقه يعمل حتى في الخلفية! لو كان هناك إمكانية لجعل Activity تبقى للعمل في الخلفية فستحل المشكلة؛ ولكن ال Activity ثقيلة على الذاكرة, فهي تحوي على الواجهة بالكامل والتي لا تظهر اصلا في شاشة المستخدم, فلماذا يجبر النظام على ابقائها في الذاكرة فقط لتشغيل الموسيقى؟
هنا تأتي Service للانقاذ, فهي تحوي الأوامر التي يريد المطور منها أن تعمل حتى وإن كان التطبيق مغلقا. على عكس Activity فهي خفيفة على الذاكرة وتحوي على أوامر فقط من دون واجهة, ولكن هذا لا يعني بأن المطور لا يستطيع اضافة أوامر ثقيلة فيها. فوائد Service متعدده منها إمكانية استعماله للاتصال بالسيرفر وتحديث البيانات منه باستمرار بدلا من إنتظار المستخدم لفتح التطبيق حتى يتم التحديث, وهذا شيء مفيد في حالة أن التحديث في الخلفية يهم المستخدم كتحديث قائمة الرسائل الواردة في البريد.

Broadcast Receiver

لنفرض أنك تصمم منبه وتريد كتابة الأوامر التي ستبدأ بإصدار التنبيه في الوقت المحدد, بالطبع أنت تعلم الآن أن إستعمال Activity لا ينفع فلو كتبت الأوامر فيها فذلك يعني أن على البرنامج أن يكون مفتوحا حتى يعمل المنبه, إذا هل نستعمل Service؟ يمكننا ذلك, ولكنها ستعمل دائما وستأخذ من جهد المعالج في شيء لا فائدة له معظم الوقت.
هنا تظهر الحاجة إلى Broadcast Receiver, يقوم أندرويد بإرسال الكثير من ال Broadcast لمختلف التطبيقات ليعلمها بحصول event او حدث معين في الجهاز, هذا الحدث قد يكون مثل: نسبة البطارية, إغلاق الشاشة, أخذ screenshot للشاشة وغيرها الكثير. إذا أردت أن تنفذ أمراً برمجيا بعد حصول أحد هذه الأحداث فعليك أن تقوم بكتابة Broadcast Receiver في تطبيقك حتى يتمكن من إستلام Broadcast عن وقوع الحدث اللذي تريده. لحل مشكلة المثال السابق, عليك أن تكتب خوارزمية runAlarm(); بعد إستلامك Broadcast عن أن ساعة النظام توافق الساعة التي إختارها المستخدم.
يمكن للتطبيقات أيضا أن تقوم بإرسال Broadcast بدلا من إستلامه, لا يمكنك أن ترسله لتطبيق معين بل سيتكفل النظام بإرساله للتطبيقات التي طلبت إستلامه . هذا قد يكون مفيدا في الكثير من الأوقات, مثلا يمكنك أن تستعملها كوسيلة تواصل بين تطبيقاتك الخاصة؛ إذا قام المستخدم بتحميل ملف من تطبيق A, فأرسل له إشعارا “أنا جاهز لعرض الملف” من التطبيق B؛ حيث أن تطبيق A أرسل Broadcast عن تحميل الملف, وتطبيق B إستلمه وقام بارسال الاشعار.

Content Provider

يقدم خدمة مشاركة البيانات بين التطبيقات, وغالبا يقدم واجهة تمكن المستخدم من إختيار البيانات التي يريد مشاركتها. أنت كمستخدم تتعامل مع ال Content Provider عندما تطلب من تطبيق إرفاق صورة, بعد ضغطك على زر “إختيار الصورة” ستفتح لك واجهة Content Provider الخاصة بتطبيق الصور في جهازك أو الخاصة بالنظام, عندما تختار صورة فسيعطي ال Content Provider رابط URI للتطبيق اللذي قام بطلب الصورة, التطبيق يستفيد من هذا ال URI في معرفة موقع الصورة وارفاقها.
نحن كمطورين غالبا نتعامل مع Content Provider في حالات مشابهة لما ذكر في المثال السابق, لكن ما نريد التحدث عنه هو إمكانية إنشائك لل Content Provider الخاص بك في برنامجك. إن كان تطبيقك يحتوي على معلومات تريد من التطبيقات الأخرى الوصول إليها فإن عليك أن تقوم بتصميم Content Provider خاص بك. يمكنك أن ترى بأن تطبيقات مثل Google Drive و One Drive تقوم بتقديم Content Provider ايضا للتطبيقات التي تريد الوصول إلى الصور.
أنت لا تحتاج الى بناء Content Provider غالبا إلا اذا اردت احد الميزات التالية:
  • تمكين وصول التطبيقات الأخرى للبيانات أو الملفات الموجودة في تطبيقك.
  • تمكين المستخدم من إعطاء البيانات أو الملفات الموجودة في تطبيقك للتطبيقات الأخرى, وهنا تحتاج إلى واجهة للمستخدم يختار منها البيانات أو الملفات
  • تمكين ال widgets من الوصول للبيانات داخل التطبيق.
  • إذا أردت أن تقوم بتوفير implementation خاص بك ل CursorAdapter أو AbstractThreadedSyncAdapter أو CursorLoader كونهم على علاقة بالبيانات.
  • تقديم إقتراحات بحث خاصة, إن كنت تريد الإستفادة من خدمة البحث التي يقدمها النظام ويسهلها عليك أو حتى لو كنت تريد من التطبيقات الاخرى الوصول لمقترحاتك في بحثها. لمزيد من المعلومات عن إقتراحات البحث الخاصة إنظر Android Developers | Adding Custom Suggestions
التطبيق قد يبدأ في أي لحظة من أحد المكونات الأربعة, ليس شرطا أن يضعط المستخد أيقونة التطبيق حتى يعمل. فربما قد يبدأ تطبيقك العمل بعد إستلام Broadcast, أو يبدأ عندما يطلب برنامج أخر الوصول للمعلومات الموجودة فيه عن طريق Content Provider أو ربما حتى يكون من التطبيقات التي تعمل دوما في الخلفية على هيئة Service. ولبرمجة تطبيق أندرويد أنت لا تحتاج ل Activity دائما, فربما يكون تطبيقك يعمل ك Service أو ك Broadcast Receiver يقوم بإشعار المستخدم عند وقوع حدث معين. هذه المعلومات كلها أراها من الأساسيات التي يجب على كل مطور أندرويد أن يعرفها, ال Activity ليست كل شيء.

منقول للإفادة
يتم التشغيل بواسطة Blogger.