يمكن أن يؤدي استخدام قفل التنشيط إلى إضعاف أداء الجهاز. إذا كنت بحاجة إلى استخدام قفل تنبيه، من المهم إجراء ذلك بشكل صحيح. يتناول هذا المستند بعض أفضل الممارسات التي يمكن أن تساعدك في تجنُّب المشاكل الشائعة المتعلقة بأقفال التنشيط.
تسمية قفل التنشيط بشكل صحيح
ننصحك بتضمين اسم الحزمة أو الفئة أو الطريقة في علامة wakelock. بهذه الطريقة، إذا حدث خطأ، سيكون من الأسهل العثور على الموقع في الرمز المصدر الذي تم فيه إنشاء قفل التنشيط. إليك بعض النصائح الإضافية:
- لا تُدرِج أي معلومات تكشف الهوية الشخصية في الاسم، مثل عنوان البريد الإلكتروني. إذا رصد الجهاز معلومات تحديد الهوية الشخصية في علامة قفل التنشيط، سيسجّل
_UNKNOWNبدلاً من العلامة التي حدّدتها. - لا تستخدِم اسم الفئة أو الطريقة بشكل آلي، مثلاً من خلال استدعاء
getName(). إذا حاولت الحصول على الاسم آليًا، قد يتم تشويشه باستخدام أدوات مثل Proguard. بدلاً من ذلك، استخدِم سلسلة مضمّنة في الرمز. - لا تُضِف عدّادًا أو معرّفات فريدة إلى علامات قفل التنشيط. يجب أن يستخدم الرمز البرمجي الذي ينشئ قفل تنبيه العلامة نفسها في كل مرة يتم تشغيله. تتيح هذه الممارسة للنظام تجميع استخدام قفل التنشيط لكل طريقة.
التأكّد من أنّ تطبيقك مرئي في المقدّمة
عندما يكون قفل التنشيط نشطًا، يستخدم الجهاز الطاقة. ويجب أن يكون مستخدم الجهاز على علم بذلك. لهذا السبب، إذا كنت تستخدم قفل تنبيه، عليك عرض بعض الإشعارات للمستخدم. يعني ذلك عمليًا أنّه يجب الحصول على قفل التنشيط والاحتفاظ به في خدمة تعمل في المقدّمة. يجب أن تعرض الخدمات التي تعمل في المقدّمة إشعارًا.
إذا كانت الخدمة التي تعمل في المقدّمة ليست الخيار المناسب لتطبيقك، من المحتمل أنّه لا يجب استخدام قفل التنشيط أيضًا. راجِع مستند اختيار واجهة برمجة التطبيقات المناسبة لإبقاء الجهاز نشطًا للاطّلاع على طرق أخرى لتنفيذ العمل عندما لا يكون تطبيقك في المقدّمة.
الحفاظ على بساطة المنطق
احرص على أن تكون طريقة الحصول على أقفال التنشيط وإيقافها بسيطة قدر الإمكان. عندما تكون منطق قفل التنشيط مرتبطًا بآلات حالات معقّدة أو مهلات أو مجموعات منفّذ أو أحداث ردّ الاتصال، يمكن أن يتسبّب أي خطأ بسيط في هذا المنطق في إبقاء قفل التنشيط نشطًا لفترة أطول من المتوقّع. ويصعب تشخيص هذه الأخطاء وتصحيحها.
التأكّد من إيقاف قفل التنشيط دائمًا
إذا كنت تستخدم قفل تنبيه، عليك التأكّد من إيقاف تشغيل كل قفل تنبيه تحصل عليه بشكل صحيح. ليس الأمر سهلاً كما يبدو دائمًا. على سبيل المثال، تتضمّن التعليمة البرمجية التالية مشكلة:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
Java
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
المشكلة هنا هي أنّ الطريقة doTheWork() يمكن أن تعرض الاستثناء MyException. وفي حال حدوث ذلك، تنقل الطريقة doSomethingAndRelease() الاستثناء إلى الخارج، ولا يصل إلى استدعاء release() أبدًا. والنتيجة
هي الحصول على قفل التنشيط بدون إطلاقه، وهذا أمر سيئ للغاية.
في الرمز البرمجي المعدَّل، يضمن doSomethingAndRelease() إلغاء قفل التنشيط حتى إذا تم طرح استثناء:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Java
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}