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

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

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

بدائل استخدام ميزة "قفل التنشيط"

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

إبقاء الشاشة مفعَّلة

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

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

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