تطوير تطبيقات أندرويد هو أحد أوائل توجهات المطورين الجدد؛ فالكثير من
الجامعات تقوم بتعليم جافا لذا من الطبيعي أن يكون توجههم, ولكنني حقا
اتفاجأ من أعداد الناس اللذين لا يعلمون أساسيات هذا المجال رغم وصفهم
لأنفسهم كمطوري أندرويد. أحد تلك الأساسيات هي أنواع مكونات التطبيقات في
أندرويد, فما لا يعلمه البعض هو انه بامكانك بناء تطبيق أندرويد يعمل
بالكامل دون إستعمال أي 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 ليست كل شيء.
منقول للإفادة