يمكن للعديد من المكتبات وواجهات برمجة التطبيقات الخاصة بالنظام الحصول على عمليات قفل تنشيط يمكن نسبها إلى تطبيقك، ما قد يصعّب تحديد عملية قفل تنشيط في تطبيقك قد تتسبّب في حدوث مشكلة. إذا أسأت استخدام إحدى واجهات برمجة التطبيقات، قد يؤدي ذلك إلى احتفاظ تطبيقك بقفل التنشيط لفترة طويلة جدًا، حتى إذا لم تستدعِ واجهات برمجة التطبيقات الخاصة بقفل التنشيط مباشرةً.
في الحالات التي يتم فيها الحصول على قفل تنشيط من خلال واجهات برمجة تطبيقات أخرى، عليك تجنُّب الحصول على قفل تنشيط يدويًا.
تتضمّن هذه الوثيقة بعض أسماء أقفال التنشيط الشائعة التي قد تظهر لك عند استخدام أدوات تصحيح أخطاء أقفال التنشيط. قد تظهر لك هذه الأسماء أيضًا في تقرير من المعلومات الحيوية. في بعض الحالات، قد يكون قفل التنشيط قد تم إنشاؤه بواسطة مكتبة أو واجهة برمجة تطبيقات للنظام. في حالات أخرى، يكون هناك سبب لتشفير الأداة لاسم عملية قفل التنشيط التي تستخدمها في التطبيق. يمكنك استخدام أدوات تصحيح الأخطاء لتحديد عمليات قفل التنشيط التي لا تعمل بشكل صحيح، ثم البحث عن اسم عملية قفل التنشيط في هذا المستند لتحديد واجهة برمجة التطبيقات التي قد تتسبّب في المشكلة وكيفية حلّها.
يتناول هذا المستند الحالات التي قد يتم فيها إنشاء أقفال التنشيط. في كل حالة، على الرغم من أنّ عملية قفل التنشيط قد يتم إنشاؤها بواسطة مكتبة أو واجهة برمجة تطبيقات أخرى، يتم إسناد عملية القفل إلى التطبيق الذي استدعى واجهة برمجة التطبيقات هذه. توضّح هذه الصفحة أيضًا بعض واجهات برمجة التطبيقات التي لا تنشئ أقفال تنبيه في الحالات التي تتوقّع فيها أن تنشئها.
- AlarmManager
- الصوت والوسائط
- البلوتوث
- أدوات الاستشعار في الجهاز
- خدمة المراسلة عبر السحابة الإلكترونية من Firebase (FCM)
- JobScheduler
- الموقع الجغرافي
- WorkManager
-
_UNKNOWN: تعرضها أدوات تصحيح الأخطاء إذا بدا أنّ اسم قفل التنشيط يستخدم معلومات تحديد الهوية الشخصية (PII).
AlarmManager
يحصل AlarmManager على أقفال التنشيط وينسبها إلى التطبيق الذي يطلبها. يحصل AlarmManager على قفل التنشيط عندما يرنّ المنبّه، ويحرر القفل عند انتهاء تنفيذ طريقة onReceive() لبث المنبّه.
أسماء عمليات قفل التنشيط
تنشئ AlarmManager أقفال تنشيط بالاسم *alarm*. (علامات النجمة جزء من اسم قفل التنشيط، ولا تمثّل أحرف بدل).
الاقتراح
ننصحك باتّباع الممارسات التالية لتحسين سلوك المنبّه:
- استخدِم
AlarmManagerلتحسين معدّل تكرار جدولة المنبّه. - استخدِم نوع المنبّه
RTC_WAKEUPalarms (الذي يوقظ الجهاز) عند الضرورة فقط. - قلِّل من استخدام التنبيهات، وتجنَّب تنفيذ مهام طويلة في طريقة
onReceive().
الصوت والوسائط
يمكن لواجهات برمجة التطبيقات الخاصة بالوسائط الحصول على أقفال التنشيط عند تسجيل الصوت أو تشغيله. يتمّ إسناد عمليات قفل التنشيط إلى تطبيق الاتصال.
أسماء عمليات قفل التنشيط
تكتسب واجهات برمجة التطبيقات الخاصة بالوسائط أقفال تنشيط بأسماء مختلفة تبدأ بـ Audio:
-
AudioBitPerfect: يُستخدَم لتشغيل الصوت عبر USB بدون فقدان جودته. -
AudioDirectOut: تُستخدَم لتشغيل الصوت بدون فقدان جودته على التلفزيون أو جهاز خاص. AudioDup: يُستخدَم لتشغيل الإشعارات أثناء الاتصال باستخدام البلوتوث أو كابل USB.AudioIn: يُستخدَم لتسجيل الصوت في وضع كاميرا الفيديو عندما يكون الميكروفون نشطًا.-
AudioMix: يُستخدَم لتشغيل الصوت على جهاز مشترك. AudioOffload: يُستخدم لتشغيل الموسيقى فقط لفترة طويلة، وذلك للتطبيقات التي تتيح هذا الوضع.AudioSpatial: يُستخدم لتشغيل فيلم أو مقطع موسيقي متعدد القنوات على الأجهزة التي تتوافق مع الصوت المكاني.AudioUnknown: تُستخدَم عندما لا تنطبق الحالات الأخرى.MmapCapture: يُستخدَم لتسجيل الصوت بزمن استجابة منخفض.-
MmapPlayback: تُستخدَم لتشغيل المحتوى بزمن استجابة منخفض، مثلاً في الألعاب أو تطبيقات الصوت الاحترافية.
الاقتراح
ننصحك باتّباع الممارسات التالية:
- لا تستخدِم أسماء قفل التنشيط التي تبدأ بـ
Audio. - إذا كنت تستخدم واجهات برمجة التطبيقات الخاصة بالوسائط، لن تحتاج إلى الحصول على أقفال التنشيط مباشرةً، بل يمكنك الاعتماد على واجهات برمجة التطبيقات للحصول على أقفال التنشيط اللازمة.
- عند استخدام واجهات برمجة تطبيقات الوسائط، يجب إنهاء جلسة الوسائط عندما لا تعود بحاجة إليها.
البلوتوث
لا تحتفظ واجهات برمجة تطبيقات البلوتوث في النظام الأساسي بأي أقفال تنبيه يمكن نسبها إلى التطبيق أثناء تنفيذ إجراءات البلوتوث. للمساعدة في التحقّق من أنّ عملية نقل البيانات عبر البلوتوث تتم في الخلفية، جدوِل مهمة باستخدام WorkManager.
الاقتراح
- استخدِم ميزة إقران الأجهزة المساعدة لإقران أجهزة البلوتوث وتجنُّب الحصول على قفل تنبيه يدوي أثناء عملية الإقران.
- راجِع إرشادات التواصل في الخلفية للتعرّف على كيفية إجراء عملية التواصل عبر البلوتوث في الخلفية.
- إذا كان من الضروري استخدام قفل تنبيه يدوي، يجب ألا يتم الاحتفاظ بقفل التنبيه إلا لمدة إجراء البلوتوث.
أدوات الاستشعار في الجهاز
تتوفّر عدة طرق لتتبُّع بيانات أجهزة الاستشعار في الجهاز، مثل عدد الخطوات أو بيانات مقياس التسارع أو الجيروسكوب.
على Wear OS، استخدِم خدمات Wear Health للحصول على بيانات الجهاز، مثل الارتفاع ومعدّل نبضات القلب والمسافة المقطوعة.
إذا كانت البيانات يتم جمعها من خلال تطبيقات أخرى، يمكنك استخدام Health Connect مع WorkManager لاسترداد البيانات بشكل دوري.
في سيناريوهات مثل تتبُّع الفرق في عدد الخطوات أو المسافة المقطوعة، يمكنك استخدام Recording API على الأجهزة الجوّالة مع WorkManager لاسترداد البيانات بشكل دوري. للوصول إلى بيانات الخطوات السابقة (مثل إجمالي عدد الخطوات اليومية أو الخطوات التي تمّت خلال آخر 6 ساعات)، يتيح تطبيق Health Connect أيضًا تتبُّع الخطوات على الجهاز للأجهزة التي تعمل بالإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث.
في حالات معيّنة، قد يكون من الضروري تتبُّع بيانات مستشعر الجهاز المخصّص باستخدام
SensorManager. لا تحصل SensorManager على عمليات قفل تنشيط نيابةً عن التطبيق، إلا إذا كان المستشعر مستشعر تنبيه، ويمكن تحديد ذلك باستخدام واجهة برمجة التطبيقات isWakeUpSensor.
الاقتراح
يمكن أن يؤدي استخدام أجهزة الاستشعار للتسجيل بمعدلات أخذ عينات عالية إلى استنزاف البطارية بشكل كبير، وفي ما يلي اقتراحات لتقليل استنزاف البطارية واستخدام عمليات قفل التنشيط:
- في حال تتبُّع عدد الخطوات أو المسافة المقطوعة، استخدِم Recording API لتسجيل البيانات بطريقة فعّالة من حيث استهلاك البطارية. بالنسبة إلى الأجهزة التي تعمل بالإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث، ننصحك باستخدام Health Connect للوصول إلى بيانات الجهاز السابقة وإجمالي عدد الخطوات.
- لاستخدام ميزة التتبُّع السلبي لأجهزة الاستشعار على Wear OS، استخدِم خدمات Wear Health Services لتحسين استخدام البطارية.
- خفض معدّل تكرار بيانات جهاز الاستشعار إلى أقل من 200 هرتز
- عند تسجيل جهاز استشعار باستخدام
SensorManager، حدِّدmaxReportLatencyUsتزيد مدته عن 30 ثانية لاستخدام منطق تجميع بيانات أجهزة الاستشعار وتقليل عدد المقاطعات التي يتلقّاها التطبيق. - تجنَّب الاحتفاظ بقفل تنبيه طويل المدة طوال فترة تتبُّع بيانات أجهزة الاستشعار، واستخدِم AlarmManager بدلاً من ذلك لجدولة التنبيهات من أجل طلب بيانات أجهزة الاستشعار كل 30 ثانية أو أكثر.
خدمة المراسلة عبر السحابة الإلكترونية من Firebase (FCM)
يتم الحصول على قفل التنشيط أثناء تسليم بث رسالة
من "المراسلة عبر السحابة الإلكترونية من Firebase" (FCM) إلى التطبيق.
ويتم إلغاء قفل التنشيط بعد انتهاء تنفيذ طريقة
onMessageReceived() لبث رسالة FCM.
أسماء عمليات قفل التنشيط
يتم الحصول على قفل تنشيط بالاسم GOOGLE_C2DM.
الاقتراح
ننصحك باتّباع الممارسات التالية لتحسين سلوك FCM:
- تحسين معدّل تكرار إرسال الرسائل عبر خدمة "المراسلة عبر السحابة الإلكترونية من Firebase"
- لا تستخدِم رسائل FCM ذات الأولوية العالية إلا إذا كانت الرسالة بحاجة إلى أن يتم تسليمها على الفور.
- إكمال طريقة
onMessageReceived()في أسرع وقت ممكن لمزيد من المعلومات، يُرجى الاطّلاع على إرشادات Firebase.
JobScheduler
تكتسب مهام JobScheduler عمليات قفل التنشيط أثناء تنفيذ المهام في الخلفية. يتم تحديد التطبيق المسؤول عن عمليات الإبقاء على الشاشة نشطة من خلال التطبيق الذي أنشأ العمليات.
أسماء عمليات قفل التنشيط
تعتمد أسماء أقفال التنشيط التي يكتسبها JobScheduler على إصدار نظام Android الذي يتم تشغيلها عليه، وعلى الغرض من المهمة.
العناصر المحاطة بأقواس معقوفة هي متغيرات. على سبيل المثال، "<package_name>" هو اسم حزمة تطبيقك، وليس النص الحرفي <package name>. ومع ذلك، فإنّ *job* هي تسلسل الأحرف
*job*، مع علامات النجمة، ولا يتم استخدام علامات النجمة كأحرف بدل.
الإصدار 15 من نظام التشغيل Android والإصدارات الأقدم
تنشئ المهام التي يبدأها المستخدم أقفال تنبيه بأسماء تتّبع النمط التالي:
*job*u/@<name_space>@/<package_name>/<classname>
تستخدم الوظائف الأخرى هذا النمط:
*job*/@<name_space>@/<package_name>/<classname>
الإصدار 16 من نظام التشغيل Android والإصدارات الأحدث
تنشئ المهام التي يبدأها المستخدم أقفال تنبيه بأسماء تتّبع النمط التالي:
*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
تستخدِم المهام المُعجَّلة النمط التالي:
*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
تستخدم المهام العادية النمط التالي:
*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
مثال
لنفترض أنّ هناك مهمة معجّلة تتضمّن مساحة الاسم backup وعلامة التتبُّع started. اسم الحزمة هو com.example.app، والفئة التي أنشأت المهمة هي com.backup.BackupFileService.
على الأجهزة التي تعمل بالإصدار 15 من نظام التشغيل Android أو الإصدارات الأقدم، سيتم تسمية قفل التنشيط على النحو التالي:
*job*/@backup@/com.example.app/com.backup.BackupFileService
على الأجهزة التي تعمل بالإصدار 16 من نظام التشغيل Android أو إصدار أحدث، سيكون اسم قفل التنشيط كما يلي:
*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService
الاقتراح
راجِع استخدامك لمهام JobScheduler. على وجه الخصوص، اتّبِع إرشاداتنا بشأن تحسين استخدام البطارية لواجهات برمجة التطبيقات الخاصة بجدولة المهام.
الموقع الجغرافي
تستخدم LocationManager وFusedLocationProviderClient أقفال التنشيط للحصول على الموقع الجغرافي للجهاز وتقديمه. يتم تحديد التطبيق الذي استدعى واجهات برمجة التطبيقات هذه على أنّه المسؤول عن عمليات الإبقاء على الشاشة نشطة.
أسماء عمليات قفل التنشيط
تستخدم خدمات الموقع الجغرافي الأسماء التالية:
CollectionLib-SigCollectorNetworkLocationLocatorNetworkLocationScannerNlpCollectorWakeLockNlpWakeLock*location*
الاقتراح
- تحسين استخدام الموقع الجغرافي على سبيل المثال، يمكنك ضبط مهلات زمنية أو تجميع طلبات الموقع الجغرافي أو استخدام تعديلات الموقع الجغرافي غير النشطة.
- إذا كنت تستخدم واجهات برمجة التطبيقات الخاصة بالموقع الجغرافي، لن تحتاج إلى الحصول على أقفال التنشيط مباشرةً، بل يمكنك الاعتماد على واجهات برمجة التطبيقات للحصول على أقفال التنشيط اللازمة.
WorkManager
تكتسب المهام في WorkManager عمليات قفل التنشيط أثناء تنفيذ المهام في الخلفية. يتم تحديد التطبيق المسؤول عن عمليات الإبقاء على الشاشة نشطة من خلال التطبيق الذي أنشأ العمليات.
أسماء عمليات قفل التنشيط
تعتمد أسماء أقفال التنشيط التي يحصل عليها WorkManager على إصدار نظام Android الذي يتم تشغيلها عليه.
الإصدار 15 من نظام التشغيل Android والإصدارات الأقدم
تنشئ مهام WorkManager أقفال تنشيط بأسماء تتّبع النمط التالي:
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
الإصدار 16 من نظام التشغيل Android والإصدارات الأحدث
تنشئ المهام المعجَّلة أقفال تنبيه تحمل أسماءً تتّبع النمط التالي:
*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
تتّبع المهام العادية النمط التالي:
*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
تلقائيًا، يكون اسم العامل هو <trace_tag>.
مثال
لنفترض أنّ هناك عاملاً سريعًا اسمه BackupFileWorker. اسم الحزمة هو com.example.app.
على الأجهزة التي تعمل بالإصدار 15 من نظام التشغيل Android أو الإصدارات الأقدم، سيتم تسمية قفل التنشيط على النحو التالي:
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
على الأجهزة التي تعمل بالإصدار 16 من نظام التشغيل Android أو الإصدارات الأحدث وتستخدم WorkManager 2.10.0+،
سيتم تسمية قفل التنشيط على النحو التالي:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
الاقتراح
- يمكنك ترقية إصدار WorkManager لجعل علامات قفل التنشيط أكثر تفصيلاً على Android 16 أو الإصدارات الأحدث.
- راجِع استخدامك لبرامج WorkManager. على وجه الخصوص، اتّبِع إرشاداتنا بشأن تحسين استخدام البطارية لواجهات برمجة التطبيقات الخاصة بجدولة المهام.
_UNKNOWN
إذا رصدت أدوات تصحيح الأخطاء أنّ اسم قفل التنشيط يتضمّن معلومات تحديد الهوية الشخصية، لن تعرض اسم قفل التنشيط الفعلي. بدلاً من ذلك، يتم تصنيف قفل التنشيط على أنّه _UNKNOWN. على سبيل المثال، قد تفعل الأدوات ذلك إذا كان اسم قفل التنشيط يتضمّن عنوان بريد إلكتروني.
الاقتراح
اتّبِع أفضل الممارسات لتسمية أقفال التنشيط، وتجنَّب استخدام معلومات تحديد الهوية الشخصية في اسم قفل التنشيط. إذا عثرت على عملية قفل تنشيط باسم _UNKNOWN منسوبة إلى تطبيقك، حاوِل تحديد عملية قفل التنشيط هذه ومنحها اسمًا مختلفًا.