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

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

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

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

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

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 مرتبط بتطبيقك، حاوِل تحديد قفل التنبيه هذا ومنحه اسمًا مختلفًا.