لتجنب استنزاف البطارية، يتم إبقاء جهاز Android في وضع عدم النشاط، نائم ومع ذلك، هناك حالات يحتاج فيها أحد التطبيقات إلى تنشيط الشاشة. أو وحدة المعالجة المركزية وإبقائها نشطة لإنجاز بعض الأعمال.
ويعتمد النهج الذي تتبعه على احتياجات تطبيقك. ومع ذلك، فإن القاعدة العامة هو أنه يجب عليك استخدام أسهل نهج ممكن للحدّ من تأثير تطبيقك في موارد النظام الأقسام التالية توضح كيفية التعامل مع الحالات التي يتم فيها سلوك النوم الافتراضي للجهاز غير متوافق مع متطلبات تطبيقك.
بدائل استخدام عمليات قفل التنشيط
عليك التحقّق ممّا إذا كان استخدام تطبيقك متوافقًا مع ميزة التنشيط (Wakelock) إلى تطبيقك. تدعم الحالات أحد الحلول البديلة التالية:
إذا كان تطبيقك يجري عمليات تنزيل HTTP طويلة، ننصحك باستخدام
DownloadManager
إذا كان تطبيقك يعمل على مزامنة البيانات من خادم خارجي، ننصحك بإنشاء مزامنة محوّل
إذا كان تطبيقك يعتمد على الخدمات التي تعمل في الخلفية، ننصحك باستخدام Jobscheduler أو المراسلة عبر السحابة الإلكترونية من Firebase لتشغيل هذه الخدمات على فترات زمنية محددة.
إذا كنت بحاجة إلى تشغيل التطبيق المصاحب عند تشغيل الجهاز المصاحب ضمن النطاق، يمكنك استخدام مدير الجهاز المصاحب.
إبقاء الشاشة قيد التشغيل
يجب إبقاء الشاشة مشغَّلة لبعض التطبيقات، مثل تطبيقات الألعاب أو الأفلام. تشير رسالة الأشكال البيانية
وأفضل طريقة للقيام بذلك هي استخدام
FLAG_KEEP_SCREEN_ON
في نشاطك (وفقط في نشاط معيّن، وليس في خدمة أو في تطبيق آخر
المكون). مثلاً:
Kotlin
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } }
Java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }
تتمثل ميزة هذا الأسلوب في أنه على عكس عمليات قفل التنشيط (تمت مناقشته في مقالة إبقاء تشغيل وحدة المعالجة المركزية (CPU))، فهي لا تتطلب إذنًا خاصًا، كما أن النظام الأساسي وإدارة عملية تنقّل المستخدم بين التطبيقات بشكلٍ صحيح، بدون أن يحتاج التطبيق إلى للقلق بشأن إطلاق الموارد غير المستخدمة.
وهناك طريقة أخرى لتنفيذ ذلك وهي في ملف XML لتنسيق تطبيقك، وذلك باستخدام
السمة android:keepScreenOn
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>
يتساوى استخدام android:keepScreenOn="true"
مع استخدام
FLAG_KEEP_SCREEN_ON
يمكنك استخدام الطريقة الأفضل لتطبيقك. ميزة إعداد
العلامة آليًا في نشاطك، وهي أنها تمنحك خيار
محو العلامة آليًا لاحقًا، وبالتالي السماح بتدوير الشاشة
"وضع الاستراحة" في التلفزيون
على التلفزيون
FLAG_KEEP_SCREEN_ON
لمنع الجهاز من الدخول إلى
وضع الاستراحة
أثناء التشغيل النشط للفيديو عندما لا يتم ضبط FLAG_KEEP_SCREEN_ON
بواسطة النشاط الذي يتم تشغيله في المقدّمة، سيدخل الجهاز تلقائيًا في "وضع الاستراحة"
بعد فترة من عدم النشاط.
إبقاء وحدة المعالجة المركزية (CPU) مفعَّلة
إذا كنت بحاجة إلى الإبقاء على تشغيل وحدة المعالجة المركزية (CPU) لإكمال بعض العمل قبل
انتقال الجهاز إلى وضع السكون، يمكنك استخدام
ميزة خدمة النظام في PowerManager
تسمى عمليات قفل التنشيط. تسمح عمليات قفل التنشيط لتطبيقك بالتحكم في حالة الطاقة
للجهاز المضيف.
يمكن أن يؤدي إنشاء عمليات قفل تنشيط وتجميدها إلى تأثير كبير على استجابة الجهاز المضيف
عمر البطارية وبالتالي يجب عدم استخدام عمليات قفل التنشيط إلا عند الضرورة القصوى
واحتفظ بها لفترة قصيرة قدر الإمكان. على سبيل المثال، ينبغي ألا تحتاج أبدًا إلى
استخدام قفل التنشيط في نشاط. كما هو موضح أعلاه، إذا كنت تريد الاحتفاظ
الشاشة في نشاطك، فاستخدم
FLAG_KEEP_SCREEN_ON
تتمثل إحدى الحالات المشروعة لاستخدام قفل التنشيط في خدمة تعمل في الخلفية بحاجة إلى ضبط قفل تنشيط لمواصلة تشغيل وحدة المعالجة المركزية (CPU) وأداء الشاشة ومع ذلك، ينبغي تقليل هذه الممارسة مرة أخرى نظرًا لتأثيرها في عمر البطارية
لاستخدام قفل التنشيط، فإن الخطوة الأولى هي إضافة
إذن WAKE_LOCK
من أجل
ملف البيان لتطبيقك:
<uses-permission android:name="android.permission.WAKE_LOCK" />
إذا كان تطبيقك يتضمّن مستقبِل بث يستخدم خدمة لتنفيذ بعض المهام، إليك كيفية ضبط قفل التنشيط مباشرةً:
Kotlin
val wakeLock: PowerManager.WakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply { acquire() } }
Java
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
لفتح قفل التنشيط، اتصل
wakelock.release()
يؤدي هذا الإجراء إلى إصدار مطالبتك إلى وحدة المعالجة المركزية (CPU). من المهم تحرير قفل التنشيط نظرًا
فور انتهاء تطبيقك من استخدامه لتجنّب استنزاف البطارية.