اتّباع أفضل الممارسات المتعلّقة بقفل التنشيط

يمكن أن يؤدي استخدام قفل التنشيط إلى إضعاف أداء الجهاز. إذا كنت بحاجة إلى استخدام قفل تنشيط، من المهم إجراء ذلك بشكل صحيح. يتناول هذا المستند بعض أفضل الممارسات التي يمكن أن تساعدك في تجنُّب الأخطاء الشائعة في قفل التنشيط.

تسمية قفل التنشيط بشكل صحيح

ننصحك بتضمين اسم الحزمة أو الفئة أو الطريقة في علامة wakelock. بهذه الطريقة، في حال حدوث خطأ، سيكون من الأسهل العثور على الموقع في الرمز المصدر الذي تم إنشاء قفل التنشيط فيه. إليك بعض النصائح الإضافية:

  • لا تُدرِج أي معلومات تكشف الهوية الشخصية (PII) في الاسم، مثل عنوان البريد الإلكتروني. إذا رصد الجهاز معلومات تكشف الهوية الشخصية في علامة قفل التنشيط، فإنه يسجّل _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();
    }
}