تحديد عمليات قفل التنشيط التي أنشأتها واجهات برمجة تطبيقات أخرى

يمكن للعديد من المكتبات وواجهات برمجة التطبيقات الخاصة بالنظام الحصول على أقفال التنشيط التي يمكن نسبها إلى تطبيقك، ما قد يصعّب تحديد قفل تنشيط في تطبيقك قد يتسبّب في حدوث مشكلة. إذا أسأت استخدام إحدى واجهات برمجة التطبيقات، قد يؤدي ذلك إلى احتفاظ تطبيقك بقفل التنشيط لفترة طويلة جدًا، حتى إذا لم تستدعِ واجهات برمجة التطبيقات الخاصة بقفل التنشيط مباشرةً.

في الحالات التي يتم فيها الحصول على قفل تنشيط من خلال واجهات برمجة تطبيقات أخرى، عليك تجنُّب الحصول على قفل تنشيط يدويًا.

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

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

AlarmManager

يحصل AlarmManager على أقفال التنشيط ويربطها بالتطبيق الذي يطلبها. يحصل AlarmManager على قفل التنشيط عندما يرنّ المنبّه، ويحرر القفل عند انتهاء تنفيذ طريقة onReceive() لبث المنبّه.

أسماء عمليات قفل التنشيط

تنشئ AlarmManager أقفال تنشيط بالاسم *alarm*. (علامات النجمة جزء من اسم قفل التنشيط، ولا تمثّل أحرف بدل).

الاقتراح

ننصحك باتّباع الممارسات التالية لتحسين سلوك التنبيهات:

  • استخدِم AlarmManager لتحسين معدّل تكرار جدولة المنبّهات.
  • استخدِم نوع المنبّه RTC_WAKEUP alarms (الذي يوقظ الجهاز) عند الضرورة فقط.
  • قلِّل من استخدام التنبيهات، وتجنَّب تنفيذ مهام طويلة في طريقة 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 لاسترداد البيانات.

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

الاقتراح

يمكن أن يؤدي استخدام أجهزة الاستشعار للتسجيل بمعدلات أخذ عينات عالية إلى استنزاف البطارية بشكل كبير، وفي ما يلي اقتراحات لتقليل استنزاف البطارية واستخدام عمليات قفل التنشيط:

  • إذا كنت تتتبّع عدد الخطوات أو المسافة المقطوعة، استخدِم Recording API لتسجيل البيانات بطريقة فعّالة من حيث استهلاك البطارية.
  • للتتبُّع السلبي باستخدام أجهزة الاستشعار على 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-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *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

الاقتراح

_UNKNOWN

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

الاقتراح

اتّبِع أفضل الممارسات لتسمية أقفال التنشيط، وتجنَّب استخدام معلومات تحديد الهوية الشخصية في اسم قفل التنشيط. إذا عثرت على قفل تنبيه باسم _UNKNOWN مرتبط بتطبيقك، حاوِل تحديد قفل التنبيه هذا ومنحه اسمًا مختلفًا.