يمكن أن يؤدي استخدام قفل التنشيط إلى إضعاف أداء الجهاز. إذا كنت بحاجة إلى استخدام قفل تنبيه، من المهم إجراء ذلك بشكل صحيح. يتناول هذا المستند بعض أفضل الممارسات التي يمكن أن تساعدك في تجنُّب المشاكل الشائعة المتعلقة بأقفال التنشيط.
تسمية قفل التنشيط بشكل صحيح
ننصحك بتضمين اسم الحزمة أو الفئة أو الطريقة في علامة 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();
}
}