الجمعة، 30 أبريل 2010

دراسه تحليليه لمنصات التشغيل في الهواتف النقاله والأجهزه الكفيه

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

سوف يتم الاشاره الى الهواتف النقاله والأجهزه الكفيه في هذه الدراسه بكلمه "الهواتف النقاله" وسوف أتغاضى عن الفرق بينهما.

ان هدف كل شركه تقوم بانتاج البرمجيات هو تحقيق أكبر قدر ممكن من المبيعات، وأهم عنصر يجب أن تنتبه له الشركه اذا ارادت رفع نسبه المبيعات هو "كم عدد الناس الذين باستطاعتهم تنصيب البرنامج على أجهزتهم". لذلك فانه يمكن أن نفكر بحل هذه المشكله عن طريق ايجاد حصه السوق لكل منصه تشغيل ومن ثم العمل على انتاج برنامج يعمل على أشهر منصه وهذه النقطه الأولى التي سوف ننطلق منها.

حصة السوق لأشهر منصات التشغيل
ان أول ملاحظه سوف نلاحظها أن الموضوع هنا يختلف عنه في أجهزه الحواسيب الشخصيه، هنا كل منصه لها حصه قريبه من الأخرى رغم سيطره Symbian على السوق حاليا, والنقطه الملاحظه هي سهوله تقلب السوق وتغير الحصص وهو المتوقع حدوثه هذا العام والعام المقبل.
هذه الاحصائيه حتى الربع الثاني من عام 2009. وكما هو ملاحظ فان السيطره ما زالت حتى الأن لنظام Symbian المنتشر بصوره كبيره على هواتف Nokia. رغم ظهور منصات تشغيل جديده مثل Android وانتعاش نسبه ال iPhone.

Symbian
نظره عامه
هي المنصه الأكثر انتشارا حاليا، لها ما يقارب نصف حصه السوق. يدار هذا النظام من قبل ال Symbian Foundation. وهي منظمه غير ربحيه تقوم باداره النظام وتضم العديد من الأعضاء أشهرهم Nokia, Sony Ericsson, Motorola, Samsung وغيرهم الكثير. تم فتح الشيفر المصدريه للنظام في 4 فبراير 2010. يوجد Store يمكن المستخدمين من تحميل تطبيقات ال Symbian على أجهزه ال Nokia وهو Ovi Store.

اصدارات النظام
سوف نتحدث في هذه النقطه عن اصدارات نظام ال Symbian والمرتبطه ارتباطا وثيقا بأجهزه النوكيا لأنها الأكثر انتشارا وهي التي تهمنا، ( لن أتحدث عن UIQ ).
  1. Series 60 V1.
  2. Series 60 V2: Initial Release, Feature Pack 1, Feature Pack 2.
  3. Series 60 V3: Initial Release, Feature Pack 1, Feature Pack 2.
  4. Series 60 V5.
  5. Series 80.


ان الفرق بين البرمجه في نظام ال S60 V1 لم يختلف عنه كثيرا في النظام الذي يليه الا وهو S60 V2. أما النسخه الثالثه وهي ما يسمى اليوم بأجهزه الجيل الثالث من نوكيا فانه حدث تغير شاسع في طريقه التطوير كما أنه البرامج القديمه التي كانت تعمل على النسخ القديمه من النظام لم تعد متوافقه مع النظام الجديد.

عند صدور النسخه الجديد وهي ال S60 V5 كان من أهم المميزات الي أضافتها توفر خاصيه اللمس في الأجهزه التي تعمل عليها وكان الهدف من وجودها هو منافسه ال iPhone الذي بدأ يطغي في الساحه. من أشهر الأجهزه التي تعمل عليه هذه المنصه هي ال Nokia N97 و Nokia 5800 Express Music.

اما Series 80 فهي نزلت على عدد قليل من الأجهزه ولم تلق النجاح الذي لاقته ال S60.

خيارات التطوير المتاحة
  1. Symbian C++: Native language
  2. Open C/C++
  3. JME
  4. Flash Lite
  5. Python
  6. Web Runtime (WRT)
  7. Qt

RIM BlackBerry
نظرة عامة
هي المنصه الثانيه في الترتيب ولها ما نسبته 20.9 % من حصه السوق، طورت من قبل شركه RIM وهو نظام مغلق المصدر. جافا هي اللغه الرئيسه للتطوير على النظام وله Store يسمى AppWorld وهو يعمل على الأجهزه التي تحمل نظام 4.2 أو نظام لاحق. في الشهر الماضي - ابريل 2010 - أعلنت RIM ظهور نظامها الجديد الذي يحمل الرقم 6.0 وهو أحدث نظام لها.


اصدارات النظام
  1. 4.2
  2. 4.3
  3. 4.5
  4. 4.6
  5. 4.7
  6. 5.0
  7. 6.0
بدأت ظهور الأجهزه التي تدعم اللمس منذ الاصدار 4.7 ويجدر الاشاره الى أنه كسر التوافقيه مع الانظمه السابقه اي انه عليك اعاده ترجمته (Compile) برامجك مرتين لكي تعمل على كلا القسمين من الأنظمة.

Apple iPhone
نظرة عامة
يحتل المرتبه الثالثه في السوق، مطور من قبل شركه Apple وهو نظام مغلق المصدر. يمتاز بشكله الرائع الذي يجذب الناس اليه. يوفر خاصيه اللمس المتعدد. Objective C هي لغه التطوير الوحيده للنظام ونظام Mac OS هو النظام الوحيد الي يمكنك التطوير عليه. لا يمكن للمستخدمين رسميا تحميل البرامج الا من خلال AppStore.


تجدر الاشاره الى أن AppStore هو أول متجر الكتروني يطلق لبيع تطبيقات الهواتف النقاله وهو يعد من أنجح المتاجر الالكترونيه على الاطلاق لذلك تنبهت الكثير من الشركات لهذا الموضوع وسعوا الى انشاء افكار مشابهه ومنهم Nokia, BlackBerry, Android وغيرهم الكثير.

من الملفت للنظر أنه لا يدعم جافا ولا Adobe Flash وهو ما سبب خلافات كبيره بين Sun و Apple وبين Adobe و Apple.

في التاسع من ابريل 2010 قامت Apple بالاعلان عن نظامها الجديد iPhone OS 4.0 ومن أهم المميزات التي سيأتي بها النظام هي ميزه تعدد المهام (Multitasking).



اصدارات النظام
عدد اصدارات النظام مهول جدا, وربما يكون أكثر منصه تشغيل لها هذا العدد من الاصدارات. لمزيد من المعلومات راجع الرابط التالي.

Windows Mobile
نظره عامه
يحتل المرتبه الرابعه في الترتيب, مطور من قبل شركه ميكروسوفت وهو نظام مغلق المصدر. له Store يسمى Windows Market Place for Mobile. في الفتره الأخيره بدأ النظام يفقد حصته شيئا فشيئا، لذلك قامت ميكروسوفت بالاعلان عن Windows Phone 7 في 15 فبراير 2010 ومن المفترض أن يكون النظام الجديد نقله نوعيه وسوف تعتمد عليه في العوده الى السوق بقوه.



من أهم الخصائص التي سيقدمها هو ربطه مع XBox Live. سوف لن يقوم بدعم تعدد المهام مبدئيا ولن يدعم القص واللص ، لكن ميكروسوفت سوف تقوم بدعم هاتان الخاصيتان لاحقا عبر خاصيه التحديث التلقائي للهاتف. سوف يتم التطوير له باستخدام XNA و Silverlight مع ال .NET. سوف لن يسمح النظام الجديد بتنزيل التطبيقات الا من خلال ال Windows Market Place وهي سياسه تشابه سياسه Apple والى الأن لا يوجد الا هاتان الشركتان اللتان تفرضان هذا الشرط.

خيارات التطوير المتاحة
  1. C++, native language
  2. .NET Framework
  3. Qt
  4. JME - CDC
  5. JME - CLDC
  6. JavaFX
  7. Qt
  8. Python
Android
نظره عامة
يحتل المرتبه الخامسه في الترتيب، وهو نظام مفتوح المصدر يدار ويطور من قبل ال Open Handset Alliance وهي منظمه تضم أكثر من 65 شركة. له Store يسمى Android Market ويسمح للمستخدمين بتحميل تطبيقات ال Android. جافا هي لغه التطوير الرئيسه للنظام رغم أنه يمكن كتابه أجزاء من التطبيقات باستخدام C++.





النظام يستخدم نسخة معدله من ال Linux Kernel تم تعديلها من قبل Google. هذه النسخه تختلف عن باقي توزيعات ال Linux بشكل كبير حيث أنها لا تحتوي على native X Window System ولا على جميع مكتبات GNU القياسية، وهذا من شأنه تصعيب عمليه اعاده استخدام تطبيقات ال Linux الحاليه على ال Android.

نظام Android لم يستعمل نسخ الجافا المعروفه من JavaSE أو JavaME وهو ما يمنع التوافقيه بين تطبيقات Android وتطبيقات الجافا الحاليه. Android لم يستخدم من جافا الا طريقه الكتابه أو ما يسمى ال Syntax. هناك امكانيه لرؤيه JavaFX على Android.



هذا المقطع يعرض JavaFX على Android ومنذ ذلك الوقت لم أسمع عن هذا الأمر أي جديد.


التوقعات
  1. Symbian
  2. Android
  3. iPhone
  4. Windows Mobile
  5. BlackBerry

اصدارات النظام
  • Android 1.0
  • Android 1.1
  • Android 1.5
  • Android 1.6
  • Android 2.0
  • Android 2.0.1
  • Android 2.1
أترككم مع هذا العرض لأهم مميزات Android 2.0


Maemo
نظرة عامة
ربما تتساءلون لماذا وضعت هذه المنصة رغم أنها ليس لها ترتيب في حصص السوق. في الحقيقه ان هذه المنصه رائعه من حيث الامكانيات وتقدم شيأ جديدا لا تقدمه باقي المنصات. هي منصه طورت من قبل Nokia وهي مفتوحه المصدر. هذه المنصه تعتمد على توزيعه Debian Linux. لذلك فهي عباره عن توزيعه Linux كامله وشبيهة الى حد كبير بتوزيعات سطح المكتب وهي تختلف عن Android بأنه يمكن وبكل سهوله اعاده استخدام تطبيقات Linux الحاليه عليها.

خيارات التطوير
  • C/C++
  • Qt
  • Java
  • Python
  • Ruby
  • Mono
باختصار يمكن أن تطور عليه كما تطور على توزيعه Linux الاعتياديه. ونتيجه للنجاح الذي لاقته قامت Intel بالتعاون مع Nokia باصدار منصه MeeGo وهي نسخه معدله من Mameo لكي تعمل بكفاءه عاليه على معالجات Intel.



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

بيئات التطوير
  • Objective C
  • Symbian C++
  • C/C++
  • RIM's Java
  • Android's Java
  • Java ME
  • Java FX
  • Qt
Objective C
  • سهوله التعلم: صعبة نسبيا وهي تختلف قليلا عن لغة ال C المعروفة.
  • المنصات الي تعمل عليها: أجهزه ال iPhone وال iPod وال iPad.
  • التوافقيه: لا أعلمها..
  • تكلفه التطوير: الأدوات مجانيه ولكن تحتاج الى حاسوب Mac والى دفع 99$ للحصول على Signing Keys للمطورين.
++Symbian C
  • سهولة التعلم: صعبه نسيبا فهي تختلف عن لغة ++C التي نعرفها قليلا.
  • المنصات التي تعمل عليها: جميع الهواتف التي تعمل باستخدام منصة Symbian.
  • التوافقية: على الأغلب نسخه منفصله لكل سلسله وهناك تغييرات جذريه بسبب الاختلاف الشاسع بين S60 V2 و S60 V3 ووجود اختلاف بين S60 V3 و S60 V5.
  • تكلفة التطوير: هناك أدوات مجانية وأخرى غير مجانية.
C/C++
  • سهولة التعلم: متوسطة, وسهلة بالنسبه لمطوري Win32.
  • المنصات التي تعمل عليها: Windows Mobile, Windows CE وربما مع بعض التعديلات يمكن تشغيلها على هواتف Nokia باستخدام Open C/C++.
  • التوافقيه: على الأغلب نسخه لكل منصة ولكن التغييرات ليست كبيرة في معظم الأحيان.
  • تكلفة التطوير: يوجد أدوات مجانية تعتمد على سطر الأوامر ويمكن استخدام eMbeded VC++ او Visual Studio Standard Edition.
RIM's Java
  • سهولة التعلم: متوسطة.
  • المنصات التي تعمل عليها: أجهزة BlackBerry فقط.
  • التوافقية: نسختان على الأقل واحدة للأجهزة من 4.2.1 الى 4.6 وأخرى للأجهزه من 4.7 وما يليها بسبب عدم التوافقيه بين هذه الأنظمة.
  • تكلفة التطوير: جميع الأدوات مجانية.

Android's Java
  • سهولة التعلم: متوسطة.
  • المنصات التي تعمل عليها: أجهزة Android فقط بسبب ال Dalvik VM.
  • التوافقية: تختلف بحسب البرنامج ربما تحتاج الى نسخة واحده وربما لأكثر من نسخة اذا احتجت لمكتبات توفرها الأنظمة الجديدة, هناك بعض الشكاوى على اختلاف طريقة عمل البرنامج من جهاز لأخر.
  • تكلفة التطوير: جميع الأدوات مجانية.
Java ME
  • سهولة التعلم: متوسطة.
  • المنصات التي تعمل عليها: أكثر من 2.6 مليار جهاز يدعم جافا حتى الربع الرابع من عام 2009.
  • التوافقية: في معظم الاحيان تحتاج الى العديد من النسخ لكي تحصل على أكبر عدد من الأجهزه. باختصار Write once, debug everywhere.
  • تكلفة التطوير: جميع الأدوات مجانية.
Java FX
  • سهولة التعلم: لا أعلمها.
  • المنصات التي تعمل عليها: الحواسيب الشخصية، متصفحات الانترنت، الهواتف النقالة، أجهزة التلفاز، Play Station3، مشغلات ال Blue-ray، حاليا هي تعمل على أنظمه Windows XP, Windows Vista, Mac وهناك نسخة Beta لل Linux. أما في أجهزة الهاتف فهناك نسخة Beta لل Windows Mobile. ربما نراها على Android.
  • التوافقيه: نرجو أن تكون نسخة واحده لكن لا أظن ذلك.
  • تكلفة التطوير: جميع أدوات التطوير مجانية.
Qt
  • سهولة التعلم: لا أعلمها.
  • المنصات التي تعمل عليها: Embeded Linux, Mac OS X, Windows, Linux, Windows CE, Windows Mobile, Symbian, Maemo, MeeGo.
  • التوافقيه: نرجوا أن تكون نسخة واحدة.
  • تكلفة التطوير: أدوات التطوير مجانية.

حسننا لنأخذ الأن وقفه مع المعطيات التي تناولناها. ان أكثر لغة برمجه تغطي أكبر عدد من الأجهزه هي Java ME بلا منازع، فهل هي الخيار الأمثل؟ الجواب بالطبع لا، يوجد العديد من المعطيات التي يجب أخذها بالحسبان فمثلا صحيح أن معظم الأجهزه تدعم Java ME ولكن جزء كبير من هذه الأجهزه هي أجهزه قديمه. كما أن مستخدموا هذه الأجهزه لا يميلون بكثره الى شراء تطبيقات الهاتف النقال بعكس مستخدموا iPhone الذين لا يعيشون دون شراء تطبيقاته ربما فقط من أجل التجربة. Java ME مليئه بالقيود فهي لا تصلح للتعامل مع ال Hardware بشكل مكثف مثل Symbian C++ مثلا. حسنا ماذا عن Symbian C++ ؟ لغه قويه تحررك من قيود Java ME ولكنك سوف تدخل في مشاكل أخرى أولها هي صعوبه اللغه وقله الدعم لها. في الحقيقه هنا في الأردن لا أعرف الى الأن سوى شخص واحد فقط يستطيع عمل برنامج كامل عليها. ثم نتأتي الى مشاكل التوافقيه بين النسخ المختلفه.

حسنا ماذا عن Objective C, Android's Java, RIM's Java ؟ جميع هذه اللغات محصوره في منصات التشغيل التي تعمل عليها فقط ولا تعمل على أي شيء أخر. كنا نتمنى أن تسهل حياتنا كلما تقدم الزمن ولكن الزمن يثبت عكس ذلك، حتى أن Windows Phone 7 سار على نفس الطريق وقرر أن تعمل عليه باستخدام .NET فقط ولا شيء غيرها.

اذا كان برنامجك يهدف الى العمل على احدى المنصات السابقه فعلى الأغلب أنه لا توجد لديك خيارات كثيره وعليك المضي قدما باستعمالها.

نأتي الى أخر خيارين, أدركت Sun أنه يجب عليها استهداف أكبر عدد من المستخدمين ببرامجها ولذلك قررت اطلاق JavaFX اتي تهدف الى توحيد كتابه التطبيقات ليس بين الهواتف فقط وانما بين جميع الأجهزه على اختلافها ان كانت هواتف ام أجهزه تلفاز أم تطبيقات الانترنت وغيرها. لكن بصراحه المشروع يبدو صعب المنال فهي لم تنجح في JavaME كما كان مخططا لها وكان هدفها توحيد التطبيقات على أجهزه الهاتف فقط وظهرت المشاكل على مخلف الأجهزه فكيف ستوحد التطبيقات على كل هذه المنصات في JavaFX. شيء أخر ان نقطه القوه التي ظلت Sun مركزه عليها هو عدد الهواتف التي تدعم JavaME وبخطوه JavaFX هي ببساطه قامت بتصفير العداد لأنه لا يوجد هاتف حالي يدعم JavaME سوف يستطيع ان يدعم JavaFX وانما يمكن ان تظهر على الأجهوة الجديده فقط وهو ما يعني العودة الى نقطه الصفر.

من ناحية أخرى فان Sun أعلنت العام الماضي عن نيتها اطلاق Store خاص بلغة جافا. هذه الخطزة بنظري ربما تقلب بعض الموازين فالمحلات الخاصه ب Apple أو نوكيا هي محلات مقتصره على أجهزة محدده ولكن في Java Store سوف يكون بامكان المطورين بيع برامجهم المكتوبه بلغه جافا بغض النظر عن المنصه التي تعمل عليها هذه البرامج. كما أننا لن ننسى أن Sun سوف تقوم بدفع هذا ال Store عن طريق ال Java Update أي أنه من قبل حتى ظهوره فهو يضمن وجود مليارات المستخدمين عليه لأنهم يملكون جافا على اجهزتهم.



لنأتي الى Qt فهي أيضا تهتم بدعم عدد كبير من المنصات ويمكن عمل برامج عليها تستهدف كل هذه المنصات وهي أسهل من Symbian وأقوى من JavaME أي أنها تمتلك جميع نقاط القوة, النقطة الوحيده التي عليها هي قله عدد أجهزه Nokia التي تعمل عليها وهو ما سيختفي قريبا لأن كل أجهزة Nokia التي تعمل على نظام Symbian سوف يمكنك استهدافها باستخدام Qt من الأن فصاعدا.

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

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

الاثنين، 26 أبريل 2010

انشاء النوافذ - النموذج

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

انشاء النموذج
public Form(String title)
public Form(String title, Item[] items)
المتغير الأول هو عنوان النموذج والثاني هو العناصر التي يحتويها النموذج.

عناصر النموذج
يمكن اضافه مجموعه من العناصر الى النموذج وهي:
  1. StringItem : وهو عباره عن نص غير قابل للتعديل يستخدم في الكتابه على النموذج.
  2. Spacer: عنصر يضاف للنموذج لحجز مساحه فارغه، يستخجم عاده لتحسين شكل النموذج.
  3. TextField: مربع نصي يشبه النافذه النصيه ولكنه لا يغطي كامل الشاشه.
  4. ImageItem: عنصر الصوره وهو عباره عن صوره يتم اضافتها للنموذج.
  5. DateField: حقل اختيار التاريخ.
  6. Gauge: وهو عباره عن مؤشر للعمليات يستخدم للدلاله على وجود عمليه طويله تتطلب الانتظار من المستخدم.
مثال
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.Spacer;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.*;

public class FormDemo extends MIDlet implements CommandListener {
private Form form;
private Command cmdExit = new Command( "Exit", Command.EXIT, 0 );

public FormDemo() {
form = new Form( "Form Demo" );
form.append( "StringItem" );

StringItem si = new StringItem( "Label", "Text" );
form.append( si );

Spacer spacer = new Spacer( 100, 40 );
form.append( spacer );

TextField txt= new TextField( "Phone No", "", 100, TextField.PHONENUMBER );
form.append( txt );

try {
Image img = Image.createImage( "/duke.png" );
ImageItem imgItem = new ImageItem( "Picture", img, Item.LAYOUT_CENTER, "Picture" );
form.append( imgItem );

} catch( Exception ex ) {
System.err.println("can't load the image");
}

DateField dateField = new DateField( "Date Of Birth" , DateField.DATE_TIME );
form.append( dateField );

form.setCommandListener(this);
form.addCommand(cmdExit);

}

public void startApp() {
Display.getDisplay(this).setCurrent(form);

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
if( c == cmdExit ) {
destroyApp(true);
notifyDestroyed();

}

}
}
في السطر 20 أنشأنا النموذج وفي السطر الذي يليه قمنا باضافه StringItem مباشره الى ال Form. في السطر 23 أنشأنا StringItem جديد ثم أضفناه للنموذج في السطر 24. في السطور 26-27 أنشأنا مساحه فارغه عرضها 100 نقطه وارتفاعها 40 نقطه ثم أضفناها للنموذج. في السطور 32-39 قمنا بانشاء صوره ثم وضعناها في ImageItem ثم أضفناه للنموذج.

ملاحظات مهمه:
  1. الصوره وضعناها في ملف ال src وهو المجلد الرئيسي في المشروع لذلك فان المسار يكون على الشكل التالي: duke.png/
  2. أي عمليه IO في جافا يجب وضعها في

try {

} catch(Exception ex) {

}
في السطور 41-42 أنشأنا حقل اختيار التاريخ وأضفناه للنموذج. وفي النهايه أضفنا المتنصت وأمر الخروج. في ال startApp عرضنا النموذج السابق على شاشه الهاتف.

الخميس، 22 أبريل 2010

فزعة العرب Development Life Cycle

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

العالم الواقعي
ثلاث سنوات منذ ذلك اليوم وفي احدى الايام القريبة كنت أنا وصديقي نتمشى أثناء فترة الاستراحه واذا بة يشاهد صديقا له يكبرنا سنا وخبرة استوقفناه, سلمنا عليه واذا بصديقي يسألة سؤالا "كيف تديرون عملية انتاج برامجكم؟" على اعتبار اننا نعاني من هذه المشكلة وأحببنا أن نأخذ نصيحه منه فاذا به يجيبنا: "نحن نعتمد طريقة فزعة العرب Development Life Cycle".

فزعة العرب Development Life Cycle
كان وقع الاجابة علينا مضحكا مبكيا في نفس الوقت. سأشرح لكم ما هي هذه الطريقة. يأتي زيون ويطلب مشروعا ما أو تقفز فكره جهنمية في رأس المدير فيقرر اطلاق شارة البداية لمراثون لا نعرف له نهاية في معظم الاحيان. بعد ساعتان أو يومان على الأكثر تجد مستند يسمى User Requirement لا تعرف من كتبه ولا من أين اتى وفي معظم الأحيان شخص غير مؤهل يكون هو كاتب هذه التحفة الفنية. بعدها يأتي مدير المشروع ليأمرك ببداية البرمجة وتبدأ انت في سباق مع الزمن لكي تنهي شيئا أنت لا تعرفه ولا حتى مديرك يعرفة.

تنهي نسخة أولية من المشروع وتكون فرحا بانجازك تريها للمدير أو للزبون وتبدأ التعليقات والتغييرات. لماذا فعلت هذا؟ ولم لم تفعل ذلك؟ ونحن لم نتفق على هذه، وحبذا لو أضفت هذه. عليك تقبل الطلبات وتبدأ في تنفيذ التغييرات وتعود للسباق المحموم مرة أخرى ويبدأ التذمر من التأخر في المشروع وكيف أنه تجاوز ميزانيته المسموح بها و و و.........

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

الخلاصة
ثلاث سنوات وأنا أعمل في الشركات وما زلت أرى هذه المأساة تتكرر. أتذكر مشاريع التخرج، أتذكر كيف كنا نكتب ال documentation وكيف صممنا ال DFD وال EER وال Use Cases ولا أعلم من منهما هو العالم المثالي، هل هو ما درسته أم ما هو كائن في شركاتنا البرمجية. والعجيب في الموضوع أننا دائما نحاول اقناعهم ان هذا لا يجوز. هناك خطوات يجب أن تتم قبل ان تبدأ أصابعنا بالطقطقه على أزرار الكود ولكن لا حياة لمن تنادي.

الأربعاء، 21 أبريل 2010

انشاء النوافذ - القائمة

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

انشاء القائمة
List(String title, int listType)
List(String title, int listType, String[] stringElements, Image[] imageElements)
يمكن انشاء القائمه عن طريق تمرير عنوان القائمة ونوعها كما يمكنك ارسال الخيارات الابتدائية للقائمة والصورة لكل خيار. مع ملاحظة أن مصفوفة الصور يجب ان تكون مساوية في العدد للخيارات الموجودة في القائمة كما يمكنك تمرير القيمة null اذا كنت لا ترغب باضافة صور.

أنواع القائمة
Implicit: هي قائمة يتم فيها اختيار العناصر ضمنيا بمجرد تحديده وعند الضغط على ال Fire Button في الهاتف فانه سيتم استدعاء ال commandAction في المتنصت المضاف لهذة القائمة.

Exclusive: هي قائمة تسمح لك باختيار أحد الخيارات فقط.

Multiple: هذه القائمة تسمح لك باختيار مجموعة من الاختيارات في نفس الوقت.

معالجة الأحداث
معالجة الأحداث في القائمة implicit يتم بطريقة مختلفة قليلا حيث سوف يتم ارسال SELECT_COMMAND الى ال commandAction الموجودة في المتنصت وهذا ال command معرف داخل ال List Class.
public void commandAction(Command c, Displayable s) {
if (c == nextCommand)
// ...
else if (c == List.SELECT_COMMAND)
// ...
}
مثال
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.*;

public class Lists extends MIDlet implements CommandListener {
List mainList;
List implicitList;
List exclusiveList;
List multipleList;
Command cmdExit = new Command( "Exit", Command.EXIT, 0 );
Command cmdBack = new Command( "Back", Command.BACK, 0 );

public void startApp() {
String[] options = {"Implicit", "Exclusive", "Multiple"};
mainList = new List("List Example", Choice.IMPLICIT, options, null);
mainList.setCommandListener(this);
mainList.addCommand(cmdExit);

options = new String[] {"A", "B", "C"};
implicitList = new List("Implicit List", Choice.IMPLICIT, options, null);
implicitList.addCommand(cmdExit);
implicitList.addCommand(cmdBack);
implicitList.setCommandListener(this);

exclusiveList = new List("Exclusive List", Choice.EXCLUSIVE, options, null);
exclusiveList.addCommand(cmdExit);
exclusiveList.addCommand(cmdBack);
exclusiveList.setCommandListener(this);

multipleList = new List( "Multiple List", Choice.MULTIPLE, options, null );
multipleList.addCommand(cmdExit);
multipleList.addCommand(cmdBack);
multipleList.setCommandListener(this);

Display.getDisplay(this).setCurrent( mainList );

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
if(c == List.SELECT_COMMAND && d == mainList) {
int index = mainList.getSelectedIndex();
if( index == 0 ) {
Display.getDisplay(this).setCurrent(implicitList);

} else if(index==1) {
Display.getDisplay(this).setCurrent(exclusiveList);

} else if(index == 2) {
Display.getDisplay(this).setCurrent(multipleList);

}

} else if(c == cmdBack ) {
Display.getDisplay(this).setCurrent(mainList);

} else if(c == cmdExit) {
destroyApp(true);
notifyDestroyed();

}

}
}
في السطور من 10-13 قمنا بتعريف أربعة قوائم الأولى هي القائمة الرئيسة التي سوف تختار منها نوع القائمة التي تريد عرضها. في السطور من 18-21 تم انشاء القائمة الرئيسة واضافة الخيارات لها ثم تم اضافة الأمر cmdExit والمتنصت.

في السطور ما بين 23-27 تم انشاء القائمة الضمنية implicitList واضافة الأمران cmdExit و cmdBack واضافة المتنصت. ثم تمت اعادة العملية لكل من القائمة exclusiveList والقائمة multipleList. ثم في السطر 39 تم عرض القائمة الرئيسة.

الان سوف ننتقل الى ال commandAction في السطر 49 وبها سوف نتأكد في البداية من الأمر التابع للقائمة الضمنية مع ضرورة التأكد أن الأمر تم حدوثه في النافذة الرئيسة وليس في النافذة الداخلية حيث أنه توجد قائمتان ضمنيتان وهذا تم في السطر 50. بعد ذلك قمنا بمعرفة العنصر المحدد من القائمة والذي قام المستخدم بتحديدة ثم عرضنا القائمة المناسبة لهذا العنصر.

اذا تم اطلاق الأمر رجوع cmdBack نقوم بالعودة للقائمة الرئيسة عن طريق عرضها على نافذة الهاتف.

الجمعة، 16 أبريل 2010

انشاء النوافذ - نافذة التنبيه

نافذة التنبيه
هي نافذة تقوم بعرض بيانات للمستخدم لمدة معينة من الوقت ثم تختفي. تستخدم هذه النافذة عادة لعرض رسائل الاخطاء والتحذيرات وغيرها من المعلومات للمستخدم.

انشاء نافذة التنبيه
public Alert(String title)
public Alert(String title, String alertText, Image alertImage, AlertType alertType)
أنواع التنبيهات
Info: تستخدم لعرض معلومات عامة للمستخدم.
Alarm: يستخدم لعرض رسالة تنبية عند حدوث حدث معين يكون المستخدم قد طلب تنبيهة علية مثل منبة الساعة او منبة حدوث اجتماع.
Confirmation: يستخدم لتأكيد حدوث شئ ما للمستخدم.
Error: يستخدم لتنبية المستخدم على حدوث خطأ ما في البرنامج.
Warning: ويستخدم لتحذير المستخدم من عملية خطيرة مثل مسح بعض البيانات وغيرها من العمليات.

التحكم في مدة ظهور النافذة
تظهر نافذة التنبية لمدة معينة ثم تختفي ويمكن تغيير هذه المده عن طريق الامر التالي:
setTimeout(int time)
ويكون الوقت المرسل بال milliseconds ويمكنك أن ترسل الية القيمه Alert.FOREVER وبذلك لن تختفي شاشة التنبية حتى يأمرها المستخدم بذلك.

مثال
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.*;

public class Alerts extends MIDlet implements CommandListener {
private Form mainForm;
private Command cmdExit;
private Command cmdInfo;
private Command cmdAlarm;
private Command cmdConfirm;
private Command cmdError;
private Command cmdWarning;

public void startApp() {
mainForm = new Form( "Alerts" );
cmdExit = new Command( "Exit", Command.EXIT, 0 );
cmdInfo = new Command( "Info", Command.SCREEN, 0 );
cmdAlarm = new Command( "Alarm", Command.SCREEN, 0 );
cmdConfirm = new Command( "Confirm", Command.SCREEN, 0 );
cmdError = new Command( "Error", Command.SCREEN, 0 );
cmdWarning = new Command( "Warning", Command.SCREEN, 0 );

mainForm.addCommand( cmdExit );
mainForm.addCommand( cmdInfo );
mainForm.addCommand( cmdAlarm );
mainForm.addCommand( cmdConfirm );
mainForm.addCommand( cmdError );
mainForm.addCommand( cmdWarning );
mainForm.setCommandListener( this );

Display.getDisplay(this).setCurrent(mainForm);

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
if( c == cmdExit ) {
destroyApp(true);
notifyDestroyed();

} else if( c == cmdInfo ) {
Alert alert = new Alert( "Alert", "Info", null, AlertType.INFO );
Display.getDisplay(this).setCurrent( alert );

} else if( c == cmdAlarm ) {
Alert alert = new Alert( "Alert", "Alarm", null, AlertType.ALARM );
Display.getDisplay(this).setCurrent( alert );


} else if( c == cmdConfirm ) {
Alert alert = new Alert( "Alert", "Confirmation", null, AlertType.CONFIRMATION );
Display.getDisplay(this).setCurrent( alert );

} else if( c == cmdError ) {
Alert alert = new Alert( "Alert", "Error", null, AlertType.ERROR );
Display.getDisplay(this).setCurrent( alert );

} else if( c == cmdWarning ) {
Alert alert = new Alert( "Alert", "Warning", null, AlertType.WARNING );
alert.setTimeout( Alert.FOREVER );
Display.getDisplay(this).setCurrent( alert );

}

}
}
في السطور من 21-34 قمنا بانشاء أمر الخروج و 5 أوامر أخرى لعرض نوافذ التنبيهات. في السطور من 28-33 قمنا باضافة هذه الأوامر الى النافذة التي سوف نعرضها على شاشة الهاتف. في السطر 34 أضافنا المتنصت الى اللنافذة mainForm. في السطر 36 عرضنا النافذة mainForm على شاشة الهاتف. الان اذا قام المستخدم بضغط أي أمر فان ال commandAction سوف تستدعى تلقائيا ويرسل لها الامر الذي ضغط علية المستخدم. في ال commandAction قمنا بفحص الامر المرسل والاستجابة بشكل صحيح لكل أمر. جميع نوافذ التنبية تعرض لمدة معينه ثم تختفي وتعود نافذة ال mainForm الى شاشة الهاتف الا النافذة الاخيرة فهي لا تختفي الا اذا ضغط المستخدم على الأمر Done المرفق معها وذلك بسبب وجود الامر
alert.setTimeout( Alert.FOREVER );  

الأربعاء، 14 أبريل 2010

انشاء النوافذ - النافذة النصية

النافذة النصية
كما تحدثنا في الموضوع السابق فان النافذة النصية هي نافذة تغطي كامل شاشة الهاتف وتسمح للمستخدم ادخال النصوص.

انشاء النافذة النصية
public TextBox(String title, String text, int maxSize, int constraints)
أنواع قيود النافذة النصية

ANY: يمكنك ادخال اي حرف أو رقم أو رمز داخل المربع النصي.
EMAILADDR: يمكنك ادخال عنوان بريد الكتروني فقط.
NUMERIC: يمكنك ادخال أرقام صحيحة فقط.
PHONENUMBER: يمكنك ادخال رقم هاتف فقط.
URL: يمكنك ادخال رابط تشعبي فقط.
DECIMAL: يمكنك ادخال رقم نسبي.
PASSWORD: يمكنك من ادخال كلمة مرور.

مثال

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.*;

public class TextBoxDemo extends MIDlet implements CommandListener {

private TextBox txtAny;
private Command cmdExit = new Command("Exit", Command.EXIT, 0);

public TextBoxDemo() {
txtAny = new TextBox("Any", "", 100, TextField.ANY);
txtAny.addCommand(cmdExit);
txtAny.setCommandListener(this);

}

public void startApp() {
Display.getDisplay(this).setCurrent(txtAny);

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
destroyApp(true);
notifyDestroyed();

}

}
في هذا المثال أنشأنا نافذة نصية في ال constructor وهي تقبل أي نص ثم قمنا بوضعها على الشاشة في السطر 22.

الأحد، 11 أبريل 2010

الاستجابة للأحداث

ادارة ال Commands في النوافذ:
في موضوع اليوم سوف نتعرف على كيفية الاستجابة للأحداث باستخدام ال commands. تتم اضافة ال commands الى اي Displayable Class عن طريق الأمر التالي:

public void addCommand(Command cmd)
ويمكن حذفها باستخدام الأمر المضاد وهو:

public void removeCommand(Command cmd)
تعريف ال Commands:

Command c = new Command("OK", Command.OK, 0);
Command c = new Command(
"Run", // short label
"Run simulation", // long label
Command.SCREEN, // command type
0); // priority

يعتمد مكان ظهور ال Command في النافذة على ال نوع ال Command وعلى أولويتة وطبعا هي تختلف من من هاتف الى أخر. فعلى سبيل المثال في أجهزه ال Nokia جميع الأوامر السلبيه مثل Back, Exit, Cancel توضع على يمين الشاشة اما الأوامر الايجابيه Ok, Options تكون على يسار الشاشة والعكس تماما يحدث عند تشغيل البرنامج على هاتف Sony Ericsson. اذا كل ما علي فعله هو تحديد نوع ال Command وأهميته وسف يتولى الهاتف مهمه وضعه في المكان المناسب الذي اعتاده مستخدم الهاتف دون كتابه الكود بشكل مختلف لكل هاتف.

أنواع ال Commands:

Okلتأكيد الااختيار
Cancelالغاء عمليه معينه
Backالرجوع الى الشاشه السابقة
Stopايقاف العمليه الحاليه
Helpاظهار شاشة المساعدة
Screenأمر عام يستخدم لباقي الأومر

الاستجابة للأوامر:
أولا يحب اضاف المتنصت على النافذة المراد معالجة الأوامر عليها باستخدام الأمر التالي:

public void setListener(CommandListener l)
بعدها يجب كتابة ال commandAction() method التابعة للمتنصت.

مثال:

public class Commander extends MIDlet
implements CommandListener {
public void startApp() {
Displayable d = new TextBox(
"TextBox",
"Commander",
20,
TextField.ANY);

Command c =
new Command("Exit", Command.EXIT, 0);
d.addCommand(c);
d.setCommandListener( this );
Display.getDisplay(this).setCurrent(d);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable d) {
destroyApp( true );
notifyDestroyed();
}

}
في السطور من 4-14 قمنا بتعريف نافذة واحدة وهي مربع نصي، ثم عرفنا Command واحد نوعة EXIT ثم اضفناة ال ى هذه النافذة. بعدها جعلنا ال Commander Class هو المتنصت على الأحداث. ثم عرضنا النفذة على شاشة الهاتف.

في السطور 24-25 استجبنا للأمر Exit الذي سوف يقوم باستدعاء commandAction عندما يقوم المستخدم بالضغط عليه وبالتالي الخروج من البرنامج عن طريق notifyDestroyed.

الان ماذا لو كان هناك أكثر من أمر فكيف لي أن أحدد الأمر الذي تم طلبه من المستخدم. ماذا لو تمت اضافه نفس الامر لأكثر من نافذة يشتركون في نفس المتنصت فكيف لي أن أعرف النافذة التي وقع فيها الحدث. يمكن حل الاشكالين السابقين باستخدام المتغيرات المرسلة لل commandAction() حيث أن الأول يمثل الأمر الذي طلبه المستخدم تحديدا والثاني يمثل النافذة التي وقع عليه الحدث فلة كان عندي نافذه بها مجموعه من الأوامر يمكنني حل المشكله كالتالي:
public void commandAction(Command c, Displayable d) {
if( c == cmdExit ) {
destroyApp(true);
notifyDestroyed();

} else if( c == cmd1 ) {
// do action1

} else if( c == cmd2 ) {
// do action2

} else if( c == cmd3 ) {
// do action3

}
}

الأربعاء، 7 أبريل 2010

انشاء واجهة مستخدم عالية المستوى ( مقدمة )

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



كما نلاحظ من الصورة السابقة فان ال Classes المسؤوله عن انشاء النوافذ في الواجهات عالية المستوى توجد داخل مكتبة lcdui. ال Class الأب لجميع النوافذ هو ال Displayable. النوافذ في الواجهات عالية المستوى تضم ال Classes التالية: Alert, List, Form, TextBox. سوف نتحدث عن كل واحد منها بالتفصيل ان شاء الله.

نظرة عامة على النوافذ في الواجهات عالية المستوى

Alert
مربع الحوار وهو يستخدم لعرض رسائل الى المستخدم مثل رسائل الأخطاء والتنبيهات وغيرها.

TextBox
الصندوق النصي وهو عبارة عن صندوق يغطي كامل شاشة الموبايل ويسمح للمستخدم بالكتابة داخله.


List
القائمة وهي تغطي كامل شاشة الموبايل وتحتوي على مجموعة من الخيارات تسمح للمستخدم باختيار احداها او مجموعة منها حسب نوع القائمة.

Form
النموذج وهو نافذة تحتوي على أدوات داخلها تسمح للمستخدم بالتفاعل مع البرنامج.

كيفية عرض النافذة على شاشة الموبايل:


public void startApp() {
Display d = Display.getDisplay( this );
d.setCurrent( form );
}

الفئة Display مرتبطة بشاشة الموبايل الحقيقية وعن طريقها تستطيع أن نأمر أي نافذة بالظهور على شاشة الموبايل الحقيقية عن طريق setCurrent التي يمكن أن تمرر لها احدى النوافذ الأربع السابق ذكرها.

الاثنين، 5 أبريل 2010

كتابة أول برنامج

السلام عليكم...
في هذا الموضوع سوف نقوم بكتابة اول برنامج باستخدام JME.
  1. قم بتشغيل NetBeans.
  2. من قائمة File اختر New Project.
  3. في مربع حوار New Project تحت خيار Categories قم بتحديد Java ME ثم قم باختيار Mobile Application تحت خيار Projects ثم انقر على Next.
  4. في مربع حوار New Mobile Application قم بتعبئة HelloJME في خانة Project Name. تأكد من وجود اشارة صح أمام خانة Set As Main Project وازالة الاشاره من أمام خانة Create Hello MIDlet ثم انقر Next.
  5. في مربع حوار Default Platform Selection قم باختيار المحاكي من خانة Emulator Platform، يمكنك تحديد المحاكي الافتراضي وهو Java Platform Micro Edition SDK 3.0. في خانه ال Device يمكنك تحديد الجهاز الذي تريد ان تجربه. أنا شخصيا أفضل DefaultCldcPhone1. بعدها قم بتحديد ال configuration وال profile الذي تريد أن تعتمده. الخيار الاكثر شهرة هو CLDC 1.1 و MIDP 2.0. انقر على Next.
  6. انقر على Finish.
  7. في نافذه Projects انقر بزر الفأره الايمن على Source Packages ثم اختر New ثم اختر MIDlet.
  8. في خانة MIDlet Name ضع الاسم Hello JME وفي خانة MIDP Class Name ضع HelloJME ثم انقر Finish.
  9. نقوم بكتابة البرنامج التالي:




import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.*;

public class HelloJME extends MIDlet {    
private Form form;    
public void startApp() {        
form = new Form( "Hello JME" );        
form.append( "This is my first JME application!!" );        
Display.getDisplay( this ).setCurrent( form );            
}    
public void pauseApp() {    }    
public void destroyApp(boolean unconditional)     {}    
}

في السطر رقم 9 قمنا بتعريف نموذج من أجل عرضه على شاشه الموبايل. في السطر 10 اضفت StringItem على النموذج ثم في السطر 11 قمنا بعرضه على شاشه الموبايل. لا تقلق ان لم تفهم الكود سوف نقوم بشرح تفصيلي للعديد من الأمثله في المستقبل القريب بعون الله.

الجمعة، 2 أبريل 2010

دورة حياة ال MIDlet

في هذا الموضوع سوف نتعرف على دوره حياه تطبيقات ال MIDlets. ما يجب ان نعرفه ان تطبيقات الموبايل تختلف عن تطبيقات الجافا الاعتياديه فنحن نعلم ان كل برامج الجافا يجب ان تحتوي على Main Class وهو Class يحتوي على main method التي يبدأ منها البرنامح بالتنفيذ.



Class SomeClass {
public static void main(String args[] ) {
// init application here
}
}


ولكن الوضع مختلف في تطبيقات الموبايل حيث لا وجود لل main method واستبدلت بثلاث methods رئيسه تمثل ثلاث حالات يمكن ان تكون بها ال MIDlet الا وهي:
  1. paused
  2. active
  3. destroyed
يتحكم في دوره حياه ال MIDlet برنامج يوجد على الهاتف يسمى
Application Management Stystem أو اختصارا بال AMS فهو الذي ينشئ ال MIDlet استجابه لطلب المستخدم بتنفيذ البرنامج وهو الذي ينقلها لحاله ال paused استجابه لوقوع حدث معين مثل استقبال مكالمه هاتفيه او انطلاق المنبه. الان سوف نحاول فهم دورة حياه ال MIDlet والحالات التي يمكن ان تمر بها.


عندما يقوم المستخدم بطلب تشغيل تطبيق ال MIDlet سوف يقوم ال AMS بنقل ال MIDlet من حالة الموت الى الحاله active وذلك يتم عن طريق استدعاء startApp() method من داخل ال MIDlet وبذلك تكون ال MIDlet قد بدأت بالعمل. الان اذا امر المستخدم البرنامج بالانتهاء فانه سوف يتم استدعاء destroyApp() method وبعدها سوف تنتقل ال MIDlet الى حالة destroyed وبذلك لن يمكنك العوده الى البرنامج الا عن طريق اعادة تشغيله مرة اخرى عبر المرور ب ()startApp. اخر حالة وهي عندما يكون التطبيق في حاله active فانه يمكن ان يحدث حدث خارجي مثل استقبال مكالمه مما يضطر ال AMS الى نقل ال MIDlet الى الحالة paused عن طريق استدعاء pauseApp() method ليتمكن المستخدم من الرد على المكالمة وبعدها يمكنه العودة للبرنامج عن طريق نقل ال MIDlet مره أخرى من حالة paused الى حالة active عن طريق استدعاء ()startApp مره اخرى.

لذلك فان تطبيقات ال MIDP يجب ان تحتوي على الاقل على MIDlet واحده وهي عباره عن class يورث من ال MIDlet class ويحتوي على هذه الثلاثة methods كالتالي:




public class Application extends MIDlet {
public Application() { }

// Called when the MIDlet is created or re-started
public void startApp() { }

// Called to pause the MIDlet
public void pauseApp() { }

// Called to terminate the MIDlet
public void destroyApp(boolean unconditional)
{ }
}