تحديد ومراقبة حالة الإرساء ونوعه

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

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

ويتم أيضًا بث حالة قاعدة الإرساء في شكل Intent ثابت، ما يتيح لك معرفة ما إذا كان الجهاز في وضع الإرساء وما نوع قاعدة الإرساء؟

تحديد حالة الإرساء الحالية

يتم تضمين تفاصيل حالة الإرساء كمعلومات إضافية في البث الثابت للإجراء ACTION_DOCK_EVENT. ولأنّ العنوان ثابت، يمكنك الاتصال بـ registerReceiver()، مع ضبط null كجهاز استقبال البث. يوضح المقتطف التالي كيفية إكمال هذه العملية:

Kotlin

val dockStatus: Intent? = IntentFilter(Intent.ACTION_DOCK_EVENT).let { ifilter ->
    context.registerReceiver(null, ifilter)
}

Java

IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);
Intent dockStatus = context.registerReceiver(null, ifilter);

ويمكنك استخراج حالة الإرساء الحالية من EXTRA_DOCK_STATE الإضافية:

Kotlin

val dockState: Int = dockStatus?.getIntExtra(EXTRA_DOCK_STATE, -1) ?: -1
val isDocked: Boolean = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED

Java

int dockState -1;
if (dockStatus != null) {
  dockState = dockStatus.getIntExtra(EXTRA_DOCK_STATE, -1);
}
boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

تحديد نوع الإرساء الحالي

إذا كان الجهاز في وضع الإرساء، يمكن تثبيته بأي من أنواع الإرساء الأربعة التالية:

  • سيارة
  • مكتب
  • مكتب بسيط (تناظري)
  • مكتب متطوّر (رقمي)

لم يتمّ توفير الخيارَين الأخيرَين إلّا في المستوى 11 من واجهة برمجة تطبيقات Android، لذلك يُنصح بالتحقّق من أنواع المكاتب الثلاثة جميعها عندما تكون مهتمًا بنوع قاعدة الإرساء فقط بدلاً من أن يكون رقميًا أو تناظري على وجه التحديد:

Kotlin

val isCar: Boolean = dockState == EXTRA_DOCK_STATE_CAR
val isDesk: Boolean = dockState == EXTRA_DOCK_STATE_DESK
        || dockState == EXTRA_DOCK_STATE_LE_DESK
        || dockState == EXTRA_DOCK_STATE_HE_DESK

Java

boolean isCar = dockState == EXTRA_DOCK_STATE_CAR;
boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK ||
                 dockState == EXTRA_DOCK_STATE_LE_DESK ||
                 dockState == EXTRA_DOCK_STATE_HE_DESK;