إبقاء الجهاز نشطًا

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

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

بدائل استخدام عمليات قفل التنشيط

عليك التحقّق ممّا إذا كان استخدام تطبيقك متوافقًا مع ميزة التنشيط (Wakelock) إلى تطبيقك. تدعم الحالات أحد الحلول البديلة التالية:

إبقاء الشاشة قيد التشغيل

يجب إبقاء الشاشة مشغَّلة لبعض التطبيقات، مثل تطبيقات الألعاب أو الأفلام. تشير رسالة الأشكال البيانية وأفضل طريقة للقيام بذلك هي استخدام 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). من المهم تحرير قفل التنشيط نظرًا فور انتهاء تطبيقك من استخدامه لتجنّب استنزاف البطارية.