English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
هذه المقالة توضح كيفية حل مشكلة عدم ظهور Toast بشكل صحيح في Service في Android. أشارككم هذا للمراجعة، ويبدو كما يلي:
عند القيام بتمارين Service البسيطة، تم استدعاء Toast.makeText في جميع ثلاثة métodos OnCreate، OnStart، OnDestroy مثلما يتم استدعاء نفس الطريقة في Activity، وتم استدعاء методов onStart و onDestroy لهذه الخدمة من خلال زرين في Activity:
كود DemoService كالتالي:
@Override public void onCreate() { super.onCreate(); Toast.makeText(getApplicationContext(), "خدمة تم إنشاؤها!", Toast.LENGTH_LONG).show(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Toast.makeText(getApplicationContext(), "خدمة نشطة!", Toast.LENGTH_LONG).show(); } @Override public void onDestroy(){ super.onDestroy(); Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show(); }
بعد تشغيله، لم يتم عرض أي معلومات في DemoService.
بداً فكرت أن السياق الذي حصلت عليه غير صحيح، وأن السياق الذي يحصل عليه Service عند استدعاء getApplicationContext() هو سياق Service، ولكن بعد التدقيق، يجب أن يحصل Toast على سياق واجهة المستخدم الرئيسية حتى يمكنه الظهور، لذا بحثت قليلاً، وقد وجدت في شرح Google لـ Toast جملة:
“يمكن إنشاء وتظهر الرسالة المنبثقة من Activity أو Service. إذا أنشأت إشعارًا من Service، سيظهر أمام Activity التي تتمركز حاليًا.”
(http://developer.Android.com/guide/topics/ui/notifiers/toasts.html)
إذاً، بناءً على هذا العدد، سيكون الرسالة المنبثقة التي أنشأتها الخدمة في مقدمة Activity التي تتمركز حاليًا. ولكن لماذا لم يكن هناك تأثير؟ دعونا نرى الآن طريقة makeText.
بالطبع، مشكلة السياق، لذا لجعل الرسالة المنبثقة تعمل بشكل صحيح، يجب تشغيلها في نواة UI لـ Activity، فكيف يمكننا الحصول على سياق نواة UI؟ يمكننا ذلك من خلال استخدام Handler لتشغيل عملية مخصصة في نواة UI.
دعونا نرى الآن مصدر طريقة Toast.show:
public void show() { ... service.enqueueToast(pkg, tn, mDuration); //وضع الرسالة المنبثقة في قائمة الرسائل ... }
من الناحية النظرية، في Android، يوجد قائمة رسائل ومعديل رسائل، حيث يأخذ النواة الرئيسية رسائل من قائمة الرسائل ويقوم بمعالجتها. ويعتبر Handler كائنًا أداة، يستخدم لوضع رسائل في قائمة الرسائل. لذا نقوم بتعديل الكود الأصلي:
@Override public void onCreate() { super.onCreate(); handler=new Handler(Looper.getMainLooper()); handler.post(new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "خدمة تم إنشاؤها!", Toast.LENGTH_LONG).show(); } }); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); handler=new Handler(Looper.getMainLooper()); handler.post(new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "خدمة نشطة!", Toast.LENGTH_LONG).show(); } }); } @Override public void onDestroy(){ super.onDestroy(); handler=new Handler(Looper.getMainLooper()); handler.post(new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show(); } }); }
تظهر النتائج بعد التشغيل كالتالي:
الخلاصة:في Framework الخاص بـ Android، يجب إضافة Toast إلى الخيط الرئيسي ليعمل بشكل صحيح.
للذين يهتمون بمزيد من المعلومات حول Android، يمكنهم مراجعة موضوعات الموقع الخاصة بنا: 'دليل البدء والترقية في تطوير Android'، 'ملخص تقنيات عرض Android'، 'ملخص تقنيات التشغيل لل نشاط activity'، 'ملخص تقنيات العمل مع قاعدة بيانات SQLite في Android'، 'ملخص تقنيات العمل مع بيانات JSON في Android'، 'ملخص تقنيات العمل مع قاعدة بيانات Android'، 'ملخص تقنيات العمل مع ملفات Android'، 'ملخص تقنيات التشغيل لبطاقة SD في Android'، 'ملخص تقنيات التشغيل للموارد في Android'، و 'ملخص استخدام التحكمات في Android'.
نتمنى أن تكون هذه المقالة قد ساعدت الجميع في تصميم برامج Android.
بيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر مملوكة للكاتب الأصلي، المحتوى تم تقديمه من قبل مستخدمي الإنترنت بشكل متعاوني وتحميله، الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وقدم الأدلة ذات الصلة، وسيتم حذف المحتوى المشبوه على الفور إذا تم التحقق من صحته.