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

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

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

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

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