• 0
nardien28

مقال : دورة حياة تطبيق J2ME ( ال MIDlet )

سؤال

لماذا يجب ان يرث الصف الأساسي لكل تطبيق J2Me الصف MIDlet ؟!!

معظم المبرمجين يقومون بكتابة كود للطرق startApp و pauseApp و destroyApp بشكل اوتوماتيكي !!! حيث كل ما يعرفونه انه عليهم كتابة كود للطريقة startApp يعبر عن السلوك الذي سيقوم به البرنامج عند بدء تشغيله ... وعلى شاكلته بالنسبة للطريقتان pauseApp و destroyApp

لماذا نقوم في كل تطبيق J2Me بكتابة كود للطرق startApp و pauseApp و destroyApp في الصف الأساسي مع اننا غالبا لا نستدعيها ابدا خلال تطبيقنا ؟!! من يستدعيها ؟!!

ما هو برنامج ادارة التطبيقات Application Management Software (AMS) ؟ وما فائدته ؟

ما هو سجل الدفع Push Registry ؟!! وما فائدته ؟!!

هذا مما سنعرفه في المقال التالي ..

تتفاعل الأجهزة الجوالة ( سواء الحقيقية أو محاكياتها ) واحداثها مع تطبيقك الخاص بالأجهزة الجوالة MIDlet عبر تقنية برمجية تسمى برنامج إدارة التطبيقاتApplication Management Software (AMS) وأحيانا تجدون كلمة System بدلا عن Software .

تسمى هذه التقنية في بعض المراجع مدير تطبيقات جافا Java Application Manager (JAM)

وهو القسم البرمجي من نظام تشغيل الجهازالجوال المعني بالتعامل مع تطبيقات J2ME ( الـ MIDlets ) والذي يمثل بيئة التنفيذ ومنصة لتطبيقات J2ME .

تضيفه الشركات المصنعة للجوال هذا القسم البرمجي لأجهزتها يعني ليس انت من سيبحث عنه

فإما ان يكون جوالك يدعم تطبيقات J2ME أي يحتوي على AMS

واما لا يدعم تطبيقات J2ME (لا يحتوي على AMS ) عندئذ لا أمل في تشغيل أي MIDlet عليه .

برنامج إدارة التطبيقات AMS هو المسؤول عن عمليات تهيئة و بدء وانهاء وايقاف واستكمال عمل برنامجك في الجوال كما انه المسؤول عن عملية تنصيب برنامجك أو ازالته من الجوال وهو المسؤول عن استخلاص وقراءة المعلومات حول تطبيقك من ملف JAD .

يقرأ برنامج إدارة التطبيقات AMS توصيف التطبيق Java Application Descriptor (JAD) ليستطيع الولوج لملف الـJAR و للحصول على بعض المعلومات التي تساعد الـ AMS على التعامل مع تطبيقك مثل أسماء صفوف تطبيقك واسم الصف الأساسي و معلومات اخرى سنعرفها لاحقا .

يكون تطبيقك في عرف AMS في احدى حالات ثلاث يتحكم بها طرق الصف MIDlet هذه الحالات هي :

  • برنامجك فعال Active
  • برنامجك متوقف عن العمل Paused
  • برنامجك في حالة انتهاء (غير فعال) Destroyed

يجب على برنامجك وراثه extends الصف javax.microedition.midlet.MIDlet

ومن ثم اعادة كتابة كود و تعيين سلوك الطرق المجردة pauseApp و startApp و destroyApp الموجودة في الصف MIDlet .

هذه الطرق ليس تطبيقك من سيستدعيها ولا هو المعني بالتعامل معها .

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

والشكل يوضح مخطط تنقل التطبيق بين الحالات الثلاث :

53dc6a1a81.jpg

حال تنصيب برنامجك على الجوال (باستلامه من الانترنت أو بواسطة البلوتوث أو الاشعة تحت الحمراء)

يجري وضع كل ملفات التطبيق (ملفات صفوف ، ملفات توصيف ، ملفات التخزين الدائم ، ملفات وسائط .. الخ ) في وسائط تخزين الجهاز الدائمة كما يقوم برنامج ادارة التطبيقات AMS في جوالك بوضع برنامجك في الحالة ايقاف Paused

وذلك بانشاء مثيل عن برنامجك باستدعاء الباني الأساسي (الخالي من البرامترات ) عبر new .

MyMIDlet MIDlet=new MyMIDlet();

وذلك بفرض اني سميت صف التطبيق الأساسي الذي يرث الصف MIDlet بـ MyMIDlet

ملاحظة : هذا (تنصيب البرنامج) ليس الحدث الوحيد الذي يؤدي ببرنامجك الى حالة الإيقاف Paused .

يصبح برنامجك في حالة ايقاف عندما يقوم برنامج ادارة التطبيقات AMS باستدعاء الطريقة pauseApp على برنامجك الفعال .

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

حالة الإيقاف Paused

في حالة الإيقاف ينتظر بريمجك ان تحين فرصة مناسبة للإنتقال الى حالة الفعالية تبعا لما يراه AMS مناسبا مثل الضغط على ايقونة برنامجك للولوج اليه .

في هذه الحالة لا يستطيع بريمجك التعامل مع أي من موارد الجهاز (الذاكرة , نظام الملفات ,.... الخ).

هذه الحالة هي الحالة التي تسبق حالة الفعالية .. تحدث حالما يتم انتاج التطبيق .

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

MIDlet.pauseApp();

أحيانا تحتاج في برنامجك ان تنقل التطبيق لحالة الايقاف Paused عمدا كاستجابة لبعض الأحداث .

تستطيع ذلك بتقديم اشعارا أو ايعاز لبرنامج ادارة التطبيقات AMS بأن التطبيق يريد الانتقال الى حالة الايقاف وذلك باستدعاء الطريقةnotifyPaused() في برنامجك مما يجعل برنامج ادارة التطبيقات AMS يستجيب لطلب حيث يقوم باستدعاء MIDlet.pauseApp(); رغم عدم حدوث حدث خارجي يستلزم ايقاف البرنامج وانما تلبية لرغبة برنامجك لغاية في نفس المبرمج .

ملاحظة : هناك حالة استثنائية تؤدي برنامجك للانتقال لحالة الايقاف Paused غير استدعاء الـAMS للطريقة pauseApp وغير استدعاء برنامجك للطريقةnotifyPaused

وهي قيام برنامجك أثناء مسار التنفيذ بقذف استثناء من نوع MIDletStateChangeException

حالة الفعالية Active

هذه الحالة هي التي يقوم فيها برنامجك بالعمل وأداء بوظائفه المرجوه منه وعندها يكون قادرا على استخدام موارد الجهاز .

ينتقل برنامجك من حالة الإيقاف الى حالة الفعالية عندما يقوم برنامج ادارة التطبيقات AMS باستدعاء الطريقة startApp() من الغرض الذي أنشأه عن الصف الأساسي لتطبيق J2ME .

يطلب برنامجك الذي في حالة ايقاف Paused نقله الى حالة الفعالية Active باستدعاء الطريقة resumeRequest() (يستخدمها المبرمج ويكتبها بيده في كود التطبيق ) التي تقدم اشعارا لبرنامج ادارة التطبيقات AMS ان برنامجك يريد ان يصبح في حالة فعالية أو بعبارة اخرى يطلب تطبيقك من AMS ان يستدعي startApp .

عندئذ اما ان يتجاهل برنامج ادارة التطبيقات طلب برنامجك أو يضع طلبك في طابور الانتظار Queueاذا كانت هناك برامج اخرى تطلب نفس الطلب أو يقبل طلب برنامجك ويستجيب برنامج ادارة التطبيقات AMS لطلب برنامجك باستدعاء الطريقة startApp كما ذكرت سابقا لنقل برنامجك الى حالة الفعالية .

ملاحظة : تستطيع استدعاء الطريقة resumeRequest في تطبيقك لتشغيل تطبيق آخر أي لنقل تطبيق اخر غير تطبيقك من حالة الايقاف الى حالة الفعالية .

حالة الإنتهاء Destroyed

ينتقل برنامجك من حالة الفعالية أو حالة الايقاف الى حالة الانتهاء عند استدعاء برنامج ادارة التطبيقات AMS للطريقة .

  MIDlet.destroyApp(boolean unconditional)

يقوم برنامج ادارة التطبيقات AMS باستدعاء تلك الطريقة تبعا لمنظوره الخاص عندما يجد انه لاجدوى من ترك برنامجك يعمل (ليس حالة تشغيل أو فعالية)

أو عند استدعاء برنامجك للطريقة notifyDestroyed .

يستطيع برنامجك نقل نفسه بنفسه الى حالة الإنتهاء Destroyed باستدعاءه الطريقة notifyDestroyed (تبعا لمنظورالمبرمج ) التي تقدم اشعارا لبرنامج ادارة التطبيقات AMS بأن البرنامج في وضعية مناسبة للإنتهاء ( لم يعد هناك ما يفعله ) وتطلب منه استدعاء الطريقة

في حالة قام برنامج ادارة التطبيقات AMS باستدعاء الطريقة destroyApp .

MIDlet.destroyApp(boolean unconditional)

بينما يقوم برنامجك بأداء عمل مهم أو لم ينته من Thread ما

وليس الوقت مناسبا أبدا لإنهاء البرنامج ...

هنا تبرز أهمية المتحول البولياني unconditional ... اذا أخذ هذا المتحول القيمة true عندئذ سيجري اغلاق برنامجك شاء أم أبى بغض النظر عن ما كان يقوم به لحظة الاستدعاء .

واذا اخذ هذا المتحول القيمة false هذا معناه ان يرنامج ادارة التطبيقات AMS يخبر برنامجك انه يريد ان ينقل برنامجك الى حالة الإغلاف عندئذ اذا كان برنامجك يقوم بعمل مهم فانه يقوم بقذف استثناء من النوع MIDletStateChangeException (الذي ذكرته سابقا) كطلب لبرنامج ادارة التطبيقات AMS بعدم إنهائه عندئذ ينتقل لحالة الايقاف وليس الانهاء .

ولكن هذا لا يضمن ان برنامجك لن يتنقل لحالة الإنهاء وتختلف من جهاز الى جهاز طريقة معالجة طلب برنامجك للـAMS بعدم انهائه .

واذا حدث واستجاب الAMS لطلب برنامجك عندئذ يحاول الAMS في وقت لاحق استدعاء الطريقة

 MIDlet.destroyApp(boolean unconditional)

ملاحظة : حالة الانهاء تعني انه تم تحرير مرجع الذاكرة الخاص بالنسخة المنشأة عن الصف MIDlet وليس ازالة برنامجك من الجهاز .

خطأ شائع : يقوم الكثير من المبرمجين باستدعاء الطريقة destroyApp بدلا من notifyDestroyed كاستجابة لأمر الخروج Exit Command

و هذا خطأ حيث ان الطرق destroyApp و startApp و pauseApp ليست موجهةلعقل للمبرمج بل لعقل الـAMS .

الشكل التالي يوضح بنية الصف MIDlet حيث الطرق المكتوبة بالأحمر مجردة .

db2a8df815.jpg

والآن السؤال ..

ما هي الحالات التي يمكن بها بدء تشغيل تطبيق J2ME ؟

أو بأسلوب تقني .. ما هي الأحداث التي يستجيب لها برنامج ادارة التطبيقات AMS باستدعاء الطريقة startApp؟

الحالة الأولى : وهي الأكثر شيوعا .. فتح التطبيق مباشرة بالضغط على أيقونته .

الحالة الثانية : ورود أو تلقي اتصال شبكي على منفذ محدد .

يستطيع برنامج ادارة التطبيقات AMS مراقبة منفذ ذو رقم معين باحثا عن نمط اتصال محدد معين حيث

ان نمط الاتصال يمكن ان يكون أحد نمطين :

نمط رسائل : وهي ملفات مرمزة ومشفرة بطرق خاصة مثل SMS,CBS,MMS

نمط Packet : مصطلح يعبر عن بنية منطقية فيزيائية معروفة في عالم الاتصالات الشبكية ...

مثال كأنواع للـ Packet : Datagram و Socket

ولكن كيف سيطلب تطبيقك من الـAMS مراقبة المنفذ ذو الرقم x بالذات وايقاظه عند ورود اتصال شبكي من نمط y حصرا ؟!!!

هذا ما سنعرفه بعد قليل ..

الحالة الثالثة : تعريف التطبيق كعمل مؤقت Timer Task

مؤقت بفتح الفاء ..

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

ولكن كيف سيبقى الـ AMS متذكرا تاريخ وساعة ولحظة التنبيه المطلوبة لتفعيل التطبيق ...

بفرض انها بعد شهر على سبيل المثال ولن يجدي استخدام الطريقة schedule من غرض من الصف Timer

حيث قد يجري اغلاق الجهاز خلال هذا الشهر وبالتالي تموت كل الـThread الخاصة بالتطبيق .

الحل يكون باستخدام قائمة خاصة مخزنة على الجهاز تسمى سجل الدفع Push Registry

يخزن فيها الأوقات والتواريخ اللازمة لإيقاظ أو نقل أحد تطبيقات J2ME المنصبة على الجهاز من حالة الايقاف الى حالة الفعالية .

كما يخزن فيها برامترات الاتصالات الشبكية (رقم المنفذ ونمط الاتصال) المطلوبين لايقاظ (تفعيل) أحد تطبيقات J2ME المنصبة على الجهاز .

كل هذه الامور تخزن في قائمة سجل الدفع Push Registry المخزنة على وسط التخزين الدائم للجهاز بحيث لا تضيع مع اغلاق الجهاز .

ملاحظة : جرى اضافة تقنية سجل الدفع PushRegistry الى التشكيل الجانبي MIDP بدءا من اصداره الثاني MIDP 2.0

كيف يمكننا الاستفادة من تقنية سجل الدفع Push Registry وتسجيل بارامترات تطبيقنا J2ME فيها ؟!!

عملية تسجيل بارامترات تطبيق J2ME تتم وفق احدى طريقتين :

طريقة ساكنة

يجري التسجيل عن طريق اضافة برامترات معينة يدويا للملف JAD للخاصية MIDlet-Push-<n>

يجري استخدام هذا النوع من التسجيل عندما تكون بارامترات التطبيق ثابتة لا تتغير ومعلومة منذ لحظة تنصيب التطبيق .

طريقة ديناميكية

وهي طريقة برمجية حيث يجري تسجيل البرامترات اللازمة في زمن التنفيذ عبر تنفيذ سطور معينة من الكود

باستخدم الصف PushRegistry الموجود في الحزمة javax.microedition.io

وذلك يتحقق باستدعاء تطبيقك للطريقة الستاتيكية PushRegistry.registerConnection واعطائها البرامترات المناسبة مثل نوع بروتوكول الاتصال الشبكي ان كان sms أو كان Packetمنتظرة بتحديد datagram أو socket ورقم المنفذ المطلوب التصنت عليه والمتوقع ورود الرسالة أو الـPacket المنتظره منه وتكتب هذه المعلومات كبرامتر واحد بالصيغة <Protocol Type>://<Port number>

كمثال sms://1234 أو datagram://1234

وأيضا برامتر اخر هو اسم التطبيق الذي يستوجب تفعيله عند ورود هذا الاتصال الشبكي ... قد يكون تطبيق MIDlet آخر غير تطبيقك .

هذا الاستدعاء لتحقيق حالة التشغيل الثانية (ورود أو تلقي اتصال شبكي)

لمعلومات أكثر حول البرامترات وترتيبها يرجى مراجعة الـDocumentation الخاص بـالصف PushRegistry

أما لتحقيق حالة التفعيل الثالثة ( تشغيل التطبيق عن زمن وتاريخ محدد ) يتحقق باستدعاء تطبيقك للطريقة الستاتيكية PushRegistry.registerAlarm واعطائها البرامترات المناسبة مثل اللحظة الزمنية التي يستوجب تفعيل التطبيق عندها واسم التطبيق الذي يستوجب تفعيله عند ورود هذه اللحظة الزمنية... قد يكون تطبيق MIDlet آخر غير تطبيقك .

..............................................................

أظن اني الآن أجبت على سؤال الأخ HGB بالنسبة لتطبيق SMS حيث امتنعت عن الاجابة وقتها عمدا لأني كنت أحضّر لهذا الموضوع وأردت وضعه كاملا لتتضح الصورة لأن الاجابة ببضع كلمات في مثل هذا الموضوع لن تفيد شيئا .

تم تعديل بواسطه nardien28
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

5 إجابة على هذا السؤال .

  • 0

هذا بالضبط ماكنت أريده :

الحالة الثانية : ورود أو تلقي اتصال شبكي على منفذ محدد .

يستطيع برنامج ادارة التطبيقات AMS مراقبة منفذ ذو رقم معين باحثا عن نمط اتصال محدد معين حيث

ان نمط الاتصال يمكن ان يكون أحد نمطين :

نمط رسائل : وهي ملفات مرمزة ومشفرة بطرق خاصة مثل SMS,CBS,MMS

نمط Packet : مصطلح يعبر عن بنية منطقية فيزيائية معروفة في عالم الاتصالات الشبكية ...

مثال كأنواع للـ Packet : Datagram و Socket

ولكن كيف سيطلب تطبيقك من الـAMS مراقبة المنفذ ذو الرقم x بالذات وايقاظه عند ورود اتصال شبكي من نمط y حصرا ؟!!!

هذا ما سنعرفه بعد قليل ..

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

وشكرا جزيلا لكي يا ناردين على الموضوع الرائع جدا ,,,,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فى الآونه الأخير طالبت شركة نوكيا بحذف pause state من دورة حياة البرنامج وهذا لأن جميع اجهزة المحمول الجديدة لا تنقل البرنامج لهذا الحالة حيث انه عند تشغيل اى برنامج آخر اثناء تشغيل البرنامج فانه ينقل تلقائيا الى الخلفيه Backgroud ويستمر فى العمل وذلك بسبب Multi thriding المستخدم فى جميع اجهزة المحمول الجديدة

لذا اصبحت دورة الحياه للبرنامج هكذا

Active<----------->distroied

تم تعديل بواسطه Programmer : Mohamed Diraz
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا جزيلا ع المعلمات القيمة .....لكني لم افهم ما قصدك باpacketهل التصال الهاتفي العادي بين موبايلين؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرااا اختى ناردين

بجد طريقة سرد فى المواضيع ممتاز

دعواتى لكى بظهر الغيب :wub:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .