نمط التصميم للعمل البديل إذا كان التطبيق في المقدمة؟
-
20-12-2019 - |
سؤال
أقوم بإنشاء إجراء يستخدم Google Cloud Messaging لتلقي إشعارات الدفع.
يتضمن ذلك عنصرين بارزين، وهما:
- أ
WakefulBroadcastReceiver
لتلقي الرسالة من GCM. - ان
IntentService
ليتم إعلامك عند تلقي حدث GCM.
كما أنا متأكد من أن هذا هو الحال بالنسبة للعديد من التطبيقات، أود أن أتبع نهجًا مختلفًا عندما يكون لدى التطبيق نشاط في المقدمة مقابل نشاط في المقدمة.عندما يفعل التطبيق لا لديك تطبيق في المقدمة.
أرغب في نشر إشعار إلى درج الإشعارات إذا كان التطبيق غير نشط، وببساطة قم بإعادة توجيه الحدث إلى النشاط الأمامي إذا كان التطبيق نشطًا.
هل هناك نمط تصميم لهذا؟كيف يمكنني تحديد ما إذا كان التطبيق في المقدمة أم لا؟الخلفية؟
المحلول
يمكنك اتباع النهج كما هو موضح في هذا بلوق وظيفة حيث تقوم بإنشاء BroadcastReceiver
في الخاص بك Activity
بأولوية موجبة (أي أعلى من القيمة الافتراضية لـ 0
) الذي يعترض إجراءً محددًا ثم يستدعيه abortBroadcast
- يعالج هذا حالة فتح التطبيق.ثم تقوم أيضًا بالتسجيل أ BroadcastReceiver
في البيان الخاص بك والذي يتعامل مع نفس الإجراء ولكن بالأولوية الافتراضية - وهذا هو الإجراء الاحتياطي إذا لم يكن التطبيق مفتوحًا وقام بإنشاء إشعار النظام.
ثم تستخدم sendOrderedBroadcast()
لإرسال البث الخاص بك إلى جميع أجهزة الاستقبال المسجلة حسب ترتيب الأولوية.إذا كان النشاط مفتوحا، فإن الأول سوف يتعامل معه.وإلا، فسيتم تعيينه افتراضيًا على الآخر وإنشاء إشعار.
نصائح أخرى
الطريقة التي أقترح القيام بها هي على النحو التالي.
احصل على كل المنطق المتعلق بـ GCM في الخدمة (لم أستخدمه مطلقًا IntentService
, ، فلا أعلم عن أحشائها، ولكني أراها ترث من Service
).
في نشاطك، ربما لديك طريقة لبدء الخدمة (ربما يقوم المستخدم بتنشيطها من خلال زر)، لا شيء جديد هنا.
هنا يأتي الجزء الممتع.في نشاطك الذي تتعامل معه onPause()
و onResume()
.في onResume()
أنت ربط إلى الخدمة.مع آلية الربط يمكنك الحصول على مؤشر لخدمتك وإعلامها بوجودك هناك "يا خدمة أنا نشاط وأنا هنا...يرجى تخزين مؤشر لنفسي في مكان ما"، وتقوم الخدمة بتخزين مؤشر للنشاط (دعنا نسميه mActivity
).في الخاص بك onPause()
تقوم بإخطار الخدمة التي ستغادرها، وبالتالي يتم ضبط الخدمة mActivity = null
, ، ومن ثم انت فك الارتباط من الخدمة.
باستخدام هذه الآلية، في كل مرة تتلقى الخدمة إشعارًا بالدفع، فإنها تختبر mActivity
متغير لمعرفة ما إذا كان هناك نشاط مرتبط.باستخدام مؤشر لنشاطك، يمكنك استدعاء أي من أساليبه، وإعادة توجيه المعلومات...