السلام عليكم
بعض الوصايا لمبرمجي الاندرويد
هناك بعض الاشياء التي ينبغي أن يهتم بها المبرمج فإنه حتي لو جعل التطبيق سريع الاستجابة فإن هناك بعض القرارات والإجراءات التي يتخذها المبرمج قد تؤدي الي حدوث مشاكل في التطبيق لأنه في بيئة الهاتف قد تحدث اشياء انت لم تخطط لها جيدا أو تتوقعها مثل ظهور بعض الرسائل من احد التطبيقات او استقبال مكالمة مثلا فكل هذه الاشياء ان لم تضعها في الحسبان قد تؤدي الي فقد بيانات تطبيقك كما سنوضح ذلك ان شاء الله . بإختصار يجب عليك اخي المبرمج ان تسعي جاهدا لتطوير التطبيقات بحيث تتفاعل بشكل جيد ومستمر مع النظام والتطبيقات الاخري, وهذا ما سنقوم بتوضيحه في النقاط التالية ان شاء الله .
[*] حافظ علي البيانات التي أدخلها المستخدم :
دائما ضع في إعتبارك ان الاندرويد هو عبارة عن منصة للهاتف الجوال وهذا يعني بالضرورة أن هناك بعض الاحداث قد تحدث اثناء عمل تطبيقك مثلا إستقبال مكالمة سيظهر شاشة مكالمة قادمة مما يقوم بإظهار شاشة تكون فوق تطبيقك ويقوم تطبيقك باستدعاء onSaveInstanceState() & onPause() الخاصة به وهذا قد يؤدي الي فقدان بعض البيانات التي أدخلها المستخدم إذا كان تطبيقك يطلب منه إدخال بيانات واثناء إدخاله جاءت المكالمة . ولحل هذه المشكلة قم بحفظ البيانات ( ان كان تطبيقك يتطلب ادخالها ) في الدالة onSaveInstanceState() واعدها للمستخدم عند رجوع تطبيقك للعرض مرة أخري . وأبسط مثال لهذا السلوك هو تطبيق الإيميل فمثلا إذا كان المستخدم يقوم بكتابة رسالة وجاءت مكالمة أو اي شي مثله للمستخدم فيجب ان تحفظ الرسالة في درافت مثلا الي حين إنتهاء ما يشغل المستخدم كالمكالمات .
[*]2. لا تقاطع عمل المستخدم :
اذا هناك تطبيق مهم بالنسبة للمستخدم يعمل الان (كان يجري مكالمة او يكتب رسالة) فمن الجيد أن تتركه فيما يعمل بدون مقاطعة لذلك لا تقم في تطبيقك بإستدعاء الدالة startActivity() من BroadcastReceivers أو Services يعمل في الخلفية (background) لأن ذلك سوف يقطع التطبيق الذي يعمل الان مهما كان ويضايق المستخدم وبدلا من هذا ولحل هذه المشكلة يمكنك استخدام NotificationManager لتعرض ما تريده (بدون مقاطعة لأعمال المستخدم ) في الشريط العلوي من الشاشة مما يمكن للمستخدم أن يضغط فيها (بحر إختياره) ليري ما تعرضه له .
( ملاحظة : هذه النقطة تكون في حالة كان تطبيقك يعمل في الخلفية (background) وغير ظاهر للمستخدم الآن )
[*]3. اذا كان التطبيق يؤدي أعمال كثيرة, قسمها الي اجزاء :
[*]اذا كان تطبيقك يحتاج الي إجراء عمليات طويلة فمن الأفضل تقسيم ذلك الي Threads كل منها يقوم بعمل ما لكي لا يؤدي ذلك الي تعليق التطبيق لأن التطبيق يعمل في Thread UI واحد مما قد يجعل التطبيق غير قابل للإستجابة الأمر الذي يجعل النظام يعرض “Application Not Responding” للمستخدم ليسأله عما اذا كان يريد اغلاق التطبيق او انتظاره لحين الاستجابة, وهذا سلوك سيئ جدا . وقد نتكلم في هذا الموضوع بصورة مفصلة في المرات القادمة ان شاء الله .
[*]4. صمم واجهاتك لتعمل في أحجام شاشات مختلفة :
الأجهزة التي تدعم الاندرويد كثيرة ومتعددة واحجام الشاشات فيها مختلفة فعليك دائما ان تضع هذا في إعتبارك وتصمم واجهاتك لتعمل في الشاشات المختلفة وذلك بعمل نسخ مختلفة من ال layouts وال drawable مثال :
drawable-ldpi : for Low-density resources, for 100 to 140 dpi screens.
drawable-mdpi : Medium-density resources for 140 to 180 dpi screens.
drawable-hdpi : High-density resources for 190 to 250 dpi screens.
drawable-nodpi : Density-independent resources.
ولكن إنتبه ان تكون أسماء الصور بنفس الاسم مثلا إذا كان لديك صورة بإسم ic_menu_ok.png فتكون :
Res/drawable-ldpi/ic_menu_ok.png
Res/drawable-mdpi/ic_menu_ok.png
Res/drawable-hdpi/ic_menu_ok.png
ولكن يجب أن يكون لديك واحد إفتراضي بأسم drawable فقط
هذا بالنسبة للصور أما بالنسبة لل layouts فأهم شي يجب ان تراعيه هو عدم إستخدام مواضع ثابتة للمكونات (avoid using hard-coded positions and instead use relative layouts)
[*]5. إفترض ان الشبكة بطيئة :
كما قلنا أن الأجهزة التي تدعم الاندرويد متعددة وبخيارات شبكة مختلفة مع كلها يكون عنده نوع إتصال بالإنترنت ولكن سرعة كل واحد تختلف من الاخر علي حسب المودم فأل 3G مثلا سرعته ليست مثل ال GPRS وهكذا وحتي لو كان المودم 3G فإنه يعتمد علي الشبكة ايضا فلو كانت الشبكة لاتدعم ال 3G فحتي لو كان المودم يدعمه فان ذلك لايزيد سرعة الاتصال . لذلك يجب عليك (إن كان تطبيقك يحتاج للإتصال بالشبكة) ان تفرض أن الشبكة بطيئة وتصمم علي هذا الأساس فلو كانت سريعة فهذا ممتاز وإن كان غير ذلك فهذا ما إفترضته منذ البداية لانك اذا افترضت ان الشبكة سريعة فلو كان عكس توقعك فسيتغير سلوك تطبيقك وقد لايستجيب للمستخدم فترة طويلة مما يجعل المستخدم يتضايق من تطبيقك . ولإختبار ذلك قبل نشر تطبيقك للمستخدمين يمكنك استخدام ال emulator الذي يستخدم شبكة الجهاز الذي يعمل فيه وقد يكون أسرع من شبكة الهاتف لذا هناك خيار في ال emulator يحاكي الشبكات البطبيئة يمكنك ان تجده في Emulator Settings اذا كنت تستخدم ال Eclipse في launch configuration أو اذا كنت تستخدم سطر الأوامر فهناك بعض الخيارات لذلك مثل :
emulator -netspeed gsm
emulator -netspeed 14 50 //for up/down
وذلك يكون عند تشغيل ال emulator (اما اذا كنت تريد فعل ذلك اثناء عمل ال emulator فقم بالدخول الي سطر الاوامر الخاص بال emulator من خلال الامر adb shell ثم )
[*]6. حافظ علي عمر البطارية :
من المعلوم بالضرورة أن أجهزة الهاتف النقال تحتاج الي شحن مستمر من وقت لأخر وهذا يعني انها تعمل ببطارية (ههههههه إكتشاف جديد) محدودة فعليك دائما ان تصمم تطبيقك بحيث يتعامل مع الأجهزة بصورة سليمة فإن المعالج والمودم من اكثر الاجهزة التي تستهلك الطاقة . وايضا استخدام الشبكة بصورة دائمة يستهلك الطاقة فأستخدمه بأقل ما يمكنك ذلك فمثلا اذا فشل الإتصال بالشبكة فان إعادة تكرار الاتصال مرات كثيرة يستهلك طاقة كبيرة لأن الفشل في الإتصال يعني ان هناك مشكلة .
[*]بعض الوصايا لمبرمجي الاندرويد
هناك بعض الاشياء التي ينبغي أن يهتم بها المبرمج فإنه حتي لو جعل التطبيق سريع الاستجابة فإن هناك بعض القرارات والإجراءات التي يتخذها المبرمج قد تؤدي الي حدوث مشاكل في التطبيق لأنه في بيئة الهاتف قد تحدث اشياء انت لم تخطط لها جيدا أو تتوقعها مثل ظهور بعض الرسائل من احد التطبيقات او استقبال مكالمة مثلا فكل هذه الاشياء ان لم تضعها في الحسبان قد تؤدي الي فقد بيانات تطبيقك كما سنوضح ذلك ان شاء الله . بإختصار يجب عليك اخي المبرمج ان تسعي جاهدا لتطوير التطبيقات بحيث تتفاعل بشكل جيد ومستمر مع النظام والتطبيقات الاخري, وهذا ما سنقوم بتوضيحه في النقاط التالية ان شاء الله .
[*] حافظ علي البيانات التي أدخلها المستخدم :
دائما ضع في إعتبارك ان الاندرويد هو عبارة عن منصة للهاتف الجوال وهذا يعني بالضرورة أن هناك بعض الاحداث قد تحدث اثناء عمل تطبيقك مثلا إستقبال مكالمة سيظهر شاشة مكالمة قادمة مما يقوم بإظهار شاشة تكون فوق تطبيقك ويقوم تطبيقك باستدعاء onSaveInstanceState() & onPause() الخاصة به وهذا قد يؤدي الي فقدان بعض البيانات التي أدخلها المستخدم إذا كان تطبيقك يطلب منه إدخال بيانات واثناء إدخاله جاءت المكالمة . ولحل هذه المشكلة قم بحفظ البيانات ( ان كان تطبيقك يتطلب ادخالها ) في الدالة onSaveInstanceState() واعدها للمستخدم عند رجوع تطبيقك للعرض مرة أخري . وأبسط مثال لهذا السلوك هو تطبيق الإيميل فمثلا إذا كان المستخدم يقوم بكتابة رسالة وجاءت مكالمة أو اي شي مثله للمستخدم فيجب ان تحفظ الرسالة في درافت مثلا الي حين إنتهاء ما يشغل المستخدم كالمكالمات .
[*]2. لا تقاطع عمل المستخدم :
اذا هناك تطبيق مهم بالنسبة للمستخدم يعمل الان (كان يجري مكالمة او يكتب رسالة) فمن الجيد أن تتركه فيما يعمل بدون مقاطعة لذلك لا تقم في تطبيقك بإستدعاء الدالة startActivity() من BroadcastReceivers أو Services يعمل في الخلفية (background) لأن ذلك سوف يقطع التطبيق الذي يعمل الان مهما كان ويضايق المستخدم وبدلا من هذا ولحل هذه المشكلة يمكنك استخدام NotificationManager لتعرض ما تريده (بدون مقاطعة لأعمال المستخدم ) في الشريط العلوي من الشاشة مما يمكن للمستخدم أن يضغط فيها (بحر إختياره) ليري ما تعرضه له .
( ملاحظة : هذه النقطة تكون في حالة كان تطبيقك يعمل في الخلفية (background) وغير ظاهر للمستخدم الآن )
[*]3. اذا كان التطبيق يؤدي أعمال كثيرة, قسمها الي اجزاء :
[*]اذا كان تطبيقك يحتاج الي إجراء عمليات طويلة فمن الأفضل تقسيم ذلك الي Threads كل منها يقوم بعمل ما لكي لا يؤدي ذلك الي تعليق التطبيق لأن التطبيق يعمل في Thread UI واحد مما قد يجعل التطبيق غير قابل للإستجابة الأمر الذي يجعل النظام يعرض “Application Not Responding” للمستخدم ليسأله عما اذا كان يريد اغلاق التطبيق او انتظاره لحين الاستجابة, وهذا سلوك سيئ جدا . وقد نتكلم في هذا الموضوع بصورة مفصلة في المرات القادمة ان شاء الله .
[*]4. صمم واجهاتك لتعمل في أحجام شاشات مختلفة :
الأجهزة التي تدعم الاندرويد كثيرة ومتعددة واحجام الشاشات فيها مختلفة فعليك دائما ان تضع هذا في إعتبارك وتصمم واجهاتك لتعمل في الشاشات المختلفة وذلك بعمل نسخ مختلفة من ال layouts وال drawable مثال :
drawable-ldpi : for Low-density resources, for 100 to 140 dpi screens.
drawable-mdpi : Medium-density resources for 140 to 180 dpi screens.
drawable-hdpi : High-density resources for 190 to 250 dpi screens.
drawable-nodpi : Density-independent resources.
ولكن إنتبه ان تكون أسماء الصور بنفس الاسم مثلا إذا كان لديك صورة بإسم ic_menu_ok.png فتكون :
Res/drawable-ldpi/ic_menu_ok.png
Res/drawable-mdpi/ic_menu_ok.png
Res/drawable-hdpi/ic_menu_ok.png
ولكن يجب أن يكون لديك واحد إفتراضي بأسم drawable فقط
هذا بالنسبة للصور أما بالنسبة لل layouts فأهم شي يجب ان تراعيه هو عدم إستخدام مواضع ثابتة للمكونات (avoid using hard-coded positions and instead use relative layouts)
[*]5. إفترض ان الشبكة بطيئة :
كما قلنا أن الأجهزة التي تدعم الاندرويد متعددة وبخيارات شبكة مختلفة مع كلها يكون عنده نوع إتصال بالإنترنت ولكن سرعة كل واحد تختلف من الاخر علي حسب المودم فأل 3G مثلا سرعته ليست مثل ال GPRS وهكذا وحتي لو كان المودم 3G فإنه يعتمد علي الشبكة ايضا فلو كانت الشبكة لاتدعم ال 3G فحتي لو كان المودم يدعمه فان ذلك لايزيد سرعة الاتصال . لذلك يجب عليك (إن كان تطبيقك يحتاج للإتصال بالشبكة) ان تفرض أن الشبكة بطيئة وتصمم علي هذا الأساس فلو كانت سريعة فهذا ممتاز وإن كان غير ذلك فهذا ما إفترضته منذ البداية لانك اذا افترضت ان الشبكة سريعة فلو كان عكس توقعك فسيتغير سلوك تطبيقك وقد لايستجيب للمستخدم فترة طويلة مما يجعل المستخدم يتضايق من تطبيقك . ولإختبار ذلك قبل نشر تطبيقك للمستخدمين يمكنك استخدام ال emulator الذي يستخدم شبكة الجهاز الذي يعمل فيه وقد يكون أسرع من شبكة الهاتف لذا هناك خيار في ال emulator يحاكي الشبكات البطبيئة يمكنك ان تجده في Emulator Settings اذا كنت تستخدم ال Eclipse في launch configuration أو اذا كنت تستخدم سطر الأوامر فهناك بعض الخيارات لذلك مثل :
emulator -netspeed gsm
emulator -netspeed 14 50 //for up/down
وذلك يكون عند تشغيل ال emulator (اما اذا كنت تريد فعل ذلك اثناء عمل ال emulator فقم بالدخول الي سطر الاوامر الخاص بال emulator من خلال الامر adb shell ثم )
[*]6. حافظ علي عمر البطارية :
من المعلوم بالضرورة أن أجهزة الهاتف النقال تحتاج الي شحن مستمر من وقت لأخر وهذا يعني انها تعمل ببطارية (ههههههه إكتشاف جديد) محدودة فعليك دائما ان تصمم تطبيقك بحيث يتعامل مع الأجهزة بصورة سليمة فإن المعالج والمودم من اكثر الاجهزة التي تستهلك الطاقة . وايضا استخدام الشبكة بصورة دائمة يستهلك الطاقة فأستخدمه بأقل ما يمكنك ذلك فمثلا اذا فشل الإتصال بالشبكة فان إعادة تكرار الاتصال مرات كثيرة يستهلك طاقة كبيرة لأن الفشل في الإتصال يعني ان هناك مشكلة .
▬▬▬▬▬▬▬▬ஜ ۩۞۩ ஜ▬▬▬▬▬▬▬▬
أهلا وسهلا يك (زائر) في منتديات التونسية للمحمول
قوانين منتدى التونسية للمحمول ( المرور من هنا واجب )
طريقة الإنظمام إلي مجموعة أعضاء سبور € GSM Tn
هام لكل الأعضاء الجدد {اخي ..}، كنت عضومنذُ{8 أيام الأخيرة..}
كتبت وقد أيقنت يوم كتابتي بأن يدي تفنى ويبقى كتابها فإن كتبت خيرا ستجزى بمثله وإن كتبت شراً عليها حسابها...
قوانين منتدى التونسية للمحمول ( المرور من هنا واجب )
طريقة الإنظمام إلي مجموعة أعضاء سبور € GSM Tn
هام لكل الأعضاء الجدد {اخي ..}، كنت عضومنذُ{8 أيام الأخيرة..}
كتبت وقد أيقنت يوم كتابتي بأن يدي تفنى ويبقى كتابها فإن كتبت خيرا ستجزى بمثله وإن كتبت شراً عليها حسابها...