/سلسلة تعلم الأندرويد (2) الأكتيفيتي و التعامل معه

سلسلة تعلم الأندرويد (2) الأكتيفيتي و التعامل معه

 الـ Activity وكيفية التعامل معه (2)

أهلا وسهلا بكم في هذا الدرس من سلسلة تعلم معنا برمجة الأندرويد .. أسأل الله أن ينفعنا وإياكم بما علمنا.

النقاط الرئيسية :

1-    المكونات الرئيسية لأي Activity.

2-    كيفية استخدام ملف الـ AndroidManifest.xml.

3-    كيفية استخدام الـ Intent لربط الـ Activites.

4-    التعامل مع دورة حياة الـ Activity.

5-    كيفية استرجاع المعلومات من الـ Activity (تطبيق).

6-    كيفية تمرير البيانات باستخدام الـ Intent (تطبيق).

أولا : المكونات الرئيسة لأي Activity :

الأكتفيتي هو أحد مكونات التطبيق التي تمدنا بشاشة يمكن للمستخدم أن يتفاعل معها لكي يفعل شيء ما مثل الاتصال برقم أو التقاط صوره أو إرسال إيميل.

وكل تطبيق عادة يتكون من Activites متعدده وكل أكتفيتي يمكنه بدأ أكتفيتي آخر لكي يؤدي شيء ما مختلف ، وفي كل مره يبدأ فيها أكتفيتي جديد الأكتفيتي السابق يتوقف (stopped) ويختفي وراء الأكتفيتي الجديد الذي يأخذ تركيز المستخدم.

  • طريقة عمل أي Activity :

لعمل أي أكتفيتي يجب أن ننشيء subclass (ما يعرف بالكلاس الابن) من الكلاس السوبر Activity (ما يطلق عليه الكلاس الأب) ، وبنحتاج لاستخدام ما يعرف بالـ callback methods التي يستدعيهم النظام عند تنقل الأكتفيتي بين حالات مختلفة من دورة حياته (lifecycle) أكثر هذه الحالات استخداما created, stopped, resumed, destroyed.

وأهم اتنين ميثود من الـ callback methods هما:

يجب أن نقوم باستخدامها فدائما يتم استدعائها من النظام عند إنشاء الأكتفيتي لذلك يجب عمل initialize بداخلها أو تهيئة لمكونات الأكتفيتي الرئيسية وأحد أهم هذه المكونات واجهة المستخدم (UI) باستخدام ميثود setContentView لتعريف الملف الخاص بواجهة المستخدم عن طريق إعطاءها عنوان هذا الملف الذي يقوم النظام بعمله بشكل تلقائي في ملف R.java الذي تكلمنا عنه من قبل.

 باستدعاءها أول شيء عندما يغادر المستخدم الأكتفيتي للذهاب إلي أكتفيتي آخر ، ويمكن استخدامها لتسجيل بيانات أو اشياء يحتاجها المستخدم عند الرجوع مره أخري للأكتفيتي.

أما واجهة المستخدم لأي أكتفيتي فيتم تشكيلها بتسلسل من الـ views وهي كائنات (objects) مشتقة من كلاس View ممكن تكون زر أو مربع كتابه أو حتي صورة ، ولعرضها بشكل منظم يتم استخدام معها ما يسمي بالـ layouts وهي مثل أوعية لربط كل هذه العناصر مع بعض وتنسيقها في شكل معين بيختلف حسب نوع الـ layout مثل linear layout الذي قمنا باستخدامها في التطبيق الماضي وأيضا أحد الأنواع الشهيره هو relative layout.

وأشهر طريقة لتعريف layout بداخله views هي ملفات الـ xml التي تكون موجود في جزؤ ملفات المصادر داخل فولدر res/layout.

وفي الدروس القادمة سنتكلم بالتفصيل عن تصميم واجهات المستخدم إن شاء الله تعالي.

ثانيا : كيفية استخدام ملف الـ AndroidManifest.xml :

كما قلنا من قبل يجب الإعلان عن الأكتفيتي في ملف المانيفست لكي يستطيع النظام أن يصل إليه ، وللإعلان عنه نقوم بفتح ملف المانيفست وإضافة عنصر <activity> كابن لعنصر <application> علي سبيل المثال

ملاحظة : xml  ليست لغة برمجة كبقية اللغات إنما هي مصممة لتخزين البيانات بلغة مفهومة للإنسان وللإلة ، فهي لا تملك أوامر أو كلمات محددة كلغات البرمجة الأخري فمؤثرات هذه اللغة أو ما يعرف بالـ tags غير معرفة مسبقا بل نحن من نقوم بتعريف هذه التاجات ، مثل لو أنا أريد تخزين بيانات طلاب في مدرسة ما كل طالب أريد تسجيل اسمه واسم والديه فسيكون ملف الـ xml بهذا الشكل :

ي الأندرويد تم عمل scheme أو قواعد تحتوي علي elements و attributes معرفة بشكل مسبق وتم تخزينها في ملف بقواعد معينة ليتم إستخدامها.

ثالثا : أهمية الـ Intent واستخدامه :

عندما يكون تطبيقنا يحتوي علي أكثر من أكتفيتي فبالتأكيد سنحتاج للتنقل بين أكتفيتي وآخر ، في الأندرويد نتحرك بين الـ Activites من خلال ما يعرف بـ Intent.

الـ Intent من أحد المفاهيم الأساسية المهمة جدا في الأندرويد فهو يستخدم للتنقل بين الـ Activites المختلفة ، ويمكن تخيله كالغراء أو الصمغ الذي يقوم بربط الـ Activites المختلفة من تطبيقات مختلفة لكي تعمل معا كاستدعاء خدمات التصفح أو الخرائط ، فمثلا لو أردت للمستخدم أن يقوم بإرسال إيميل من تطبيقي فبدلا من بناء أكتفيتي مخصص لعمل ذلك يمكنني استخدام الـ intent لاستدعاء أكتفيتي موجود بداخل برامج النظام لعمل ذلك.

  • استخدام عنصر <intent-filter>

هو عباره عن element يتم إضافته لعنصر <activity> بداخل ملف المانيفست لتحديد كيف يمكن لمكونات التطبيقات الأخري استخدام هذا الأكتفيتي ، وعند بناء تطبيق جديد يتم أوتوماتيكيا عمل intent-filter للأكتفيتي الرئيسي تحدد أنه هو نقطة بداية هذا التطبيق ، وإذا كنا لا نريد أن نسمح لأي تطبيق آخر باستخدام أي أكتفيتي من تطبيقنا فنحن لا نحتاج لإضافة أي intent-filter آخر.

رابعا : التعامل مع دورة حياة الـ Activity :

  • أي أكتفيتي يمكن التعامل معه من خلال 3 حالات رئيسيه :

Resumed

تعني أن الأكتفيتي في صدارة الشاشة ويأخذ تركيز المستخدم.

Paused

تعني أن أكتفيتي أخر أصبح في صدارة الشاشة ويأخذ تركيز المستخدم ، ولكن هذا الأكتفيتي مازال موجود ومرئي ولكن خلف الأكتفيتي الجديد الذي يظهر الآن للمستخدم ، في هذه الحالة يكون الأكتفيتي المعطل مؤقتا موجود في ذاكرة الجهاز (memory) ويتم تخزينه بنفس حالته مع الاحتفاظ بكل بياناته ولكن يمكن للنظام في أي لحظه قتله إذا حدث ضغط كبير علي الذاكره.

Stopped

في هذه الحالة يتم حجب الأكتفيتي بشكل كامل بواسطة أكتفيتي أخر ، ولكنه يظل موجود في الخلفية وموجود في الذاكرة مع الاحتفاظ بكل بياناته ، ولكن يمكن للنظام قتله إذا احتاج مساحة في الذاكرة.

ملاحظة : الـ Activites بتكون موجوده في الذاكرة علي شكل صف أو طابور فعند إضافة أكتفيتي جديد يصبح في المقدمه والأكتفيتي القديم يصبح خلفه وهكذا حتي إذا امتلأت الذاكره يقوم النظام بالتخلص من الأكتفيتي الموجود في الخلفية عن طريق استدعاء ميثود finish وفي هذه الحالة عند احتياج استخدام الأكتفيتي مره أخري يتم بناءه من جديد عن طريق استدعاء ميثود onCreate.

  • تنفيذ الـ callback methods

كما قلنا عندما ينتقل الأكتفيتي من حالة لأخري يتم استدعاء methods معينه بشكل تلقائي من النظام للتنبيه علي هذا التغير ، لذلك يمكنني استخدام هذه الميثود لتنفيذ عمليات معينه عند الانتقال إلي مرحلة معينه كما سنري فيما بعد ، وهذا تلخيص للـ lifecycle callback methods مع التعليق علي كل ميثود لذكر استخدامها:

لاحظ: يجب استخدام كلمة super مع بداية كل ميثود لاستدعاء الميثود الموجوده بالكلاس الأب (Activity).

خامسا : استرجاع المعلومات من الـ Activity :

في تطبيقنا السابق قمنا بإطلاق أكتفيتي جديد ليقوم بعرض شكل ما فقط ولكن أحيانا قد نريد أن نسترجع معلومات من الأكتفيتي الجديد ، بمعني أني أريد فتح الأكتفيتي ليقوم بشيء ما ثم استرجع منه معلومات ، مثل أن أطلب من المستخدم ادخال اسمه وكلمة السر الخاص به.

ولكي نقوم بهذا الأمر نستخدم ميثود startActivityForResult بدلا من الميثود التي استخدمنها قبل ذلك وهي startActivity مع استخدام كائن من الـ Intent لتخزين به المعلومات المطلوبه واستخدام كلاس Toast لعرض هذه المعلومات ، ولتطبيق هذا سنقوم بعمل تطبيق به شاشتين الشاشة الرئيسية تحتوي علي زرار عند الضغط عليه تظهر الشاشة الثانية التي تحتوي علي مكان لإدخال الاسم وزرار عند الضغط عليه يقوم بغلق هذه الشاشة لتظهر الشاشة الرئيسية مره أخري مع عرض الاسم في شكل صندوقي أسفل الشاشة يظهر لوقت قصير ثم يختفي ، فهيا بنا لنقوم بعمل التطبيق في خطوات بسيطه :

1-    هنفتح برنامج الـ Eclipse ونقوم بعمل مشروع جديد وليكن باسم Activites.

2-    نقوم بإضافة زرار إلي الشاشة الرئيسية بتعديل ملف الـ main.xml الموجود داخل فولدر res/layout ليصبح الكود في داخله بهذا الشكل

ولا تنسوا بالطبع الذهاب إلي ملف strings.xml الموجود داخل فولدر res/values لإضافة قيمة نصية جديدة إلي المصادر باسم open وتحتوي مثلا علي نص Open New Activity

3-    هنقوم بعمل ملف xml جديد وليكن اسمه activity2.xml بداخل فولدر res/layout ونقوم بكتابة الكود التالي بداخله

4-    عمل class جديد داخل حزمة com.androidhas.Activites الموجوده داخل فولدر src وليكن اسمه Activity2 ولا ننسي عمل extend من الكلاس الأب أو كما يطلق عليه السوبر Activity وكتابة الكود ليصبح بهذا الشكل

5-    الذهاب إلي الأكتفيتي الرئيسي والمسمي بـ  ActivitesActivity.java والتعديل الكود بداخله ليصبح بهذا الشكل

6-    إضافة الأكتفيتي إلي ملف المانيفست AndroidManifest.xml ليصبح الكود بهذا الشكل

الخطوه الأخيره أن تقوم بتجربة البرنامج لتراه يعمل بعينيك.

فهم الكود :

سأقوم بالرجوع إلي خطوات تعديل الكود مع تقسيم سطور الكود وذكر عملها.

  • في الخطوه الرابعه
  • هذين السطرين لتعريف زرار ومربع نصي مع إعطاء كل منهما اسم ليمكن استخدامهما فيما بعد.
معناها أن الميثود القادمة موجوده وجاهزه في الكلاس السوبر وأنا قمت بعمل ميثود جديد بنفس الاسم للإستفاده من الميثود الجاهزه ، راجع الدرس الماضي لمعرفة كيفية القيام بذلك بدون كتابة كل الكود.
في السطر الأول نقوم بربط هذا الأكتفيتي بواجهة المستخدم التي قمنا بتصميمها ، وفي السطرين الأخرين نقوم بربط العناصر التي قمنا بوضعها في الواجهة مع هذا الكلاس لكي نستطيع التعامل معهما.

هذه السطر نعم لا تستغرب فهو سطر ألا تراه ينتهي بفصلة منقوطة ,وهنا نستخدم ميثود setOnClickListener وهي ميثود شهيره في الجافا نستخدمها مع الزرار للقيام بشيء ما عند الضغط عليه ، وفي داخل هذه الميثود قمنا بتعريف Intent واطلقنا عليه اسم data ثم قمنا بتخزين بعض البيانات عليه الموجوده داخل المربع النصي ثم قمنا بتمرير هذه البيانات وبعدها إغلاق هذا الأكتفيتي بإستخدام ميثود finish

  • في الخطوه الخامسه
هذا رقم أقوم أنا بتحديده لإعطاءه إلي الأكتفيتي الجديد عند إطلاقه ليقوم بإرجاعه لي عند استلام البيانات وهذا يكون مفيد عند إطلاق
أكثر من أكتفيتي وانتظار البيانات منهم لكي أستطيع تحديد أي أكتفيتي الذي أرسل هذه البيانات.
هذه الميثود تقوم بإطلاق الأكتفيتي الجديد عند الضغط علي الزر مع أعطاءه الرقم المحدد سابقا.

هذه الميثود تقوم بإستقبال البيانات ، وفي جملة if أنا أقوم بالتأكد من الرقم المحدد والرقم المرسل فإذا كانا صحيحين أقوم بعرض البيانات المرسله باستخدام الـ Toast

  • في الخطوه السادسه

انا قمت بإضافة هذا السطر فقط إلي المانيفست وهو السطر الوحيد الذي يجب إضافته حتي يعمل التطبيق.

سادسا : تمرير البيانات إلي الـ Activity باستخدام الـ Intent :

في هذا التطبيق سنتعرف علي كيفية تمرير البيانات إلي الأكتفيتي عند بداية إطلاقه ، كمثلا تمرير جملة معينه إلي الأكتفيتي الجديد ليقوم بعرضها في المربع النصي تطلب من المستخدم إدخال اسمه ، وسنتخدم التطبيق السابق مع عمل بعذ التعديلات الإضافيه بالشكل الآتي :

1-    في ملف الأكتفيتي الرئيسي ActivitesActivity.java هنقوم بعمل تعديل بسيط في ميثود handleClick لتصبح بهذا الشكل

2-    في الكلاس الثاني Activity2.java هنقوم بعمل بعض التعديلات اللازمة كما نري في هذا الكود

ملاحظة : النقاط الموجوده أسفل الكود تعني أن لم أقم بتعديل أي شيء في بقية الكود.

فهم الكود :

  • الخطوه الأولي
في السطر الأول قمت بإضافة علامتي // لجعل هذا السطر تعليق لكي يتجاهله المترجم عند تشغيل البرنامج ، وفي السطر الثاني قمت بتعريف Intent جديد لاستخدامه.
هنا نقوم بعمل كائن اسمه extras من كلاس Bundle هذا الكلاس يستخدم لتخزين البيانات فهو مثل القاموس نقوم بتسجيل كلمة مفتاحية وتخزين بها القيمة التي نريدها كما نري في السطر الثاني.

أقوم بإضافة البيانات إلي الـ Intent ثم بدأ الأكتفيتي الجديد.

  • الخطوه الثانيه
  • تعريف متغير من نوع string اسمه defaultName
عمل كائن مره أخري من كلاس Bundle للحصول علي البيانات المرسله ، ثم جعل هذه البيانات هي قيمة المتغير الذي قمنا بتعريفه في السطر السابق.

استخدام ميثود setHint لكي تقوم بإظهار هذه القيمه في المربع النصي بشكل خفيف وتختفي عند محاولة المستخدم كتابة اسمه.

  • الخطوه الأخيره أن تقوم بتجربة البرنامج ومشاركتنا النتيجة النهائية.

أشكركم علي الانتظار والمتابعه ، وأتمني من الله أن أكون وفقة لعرض المعلومات بصوره سهله وبسيطه ، وسيسعدني تلقي تعليقاتكم أو أي ملاحظات علي طريقة الشرح.