ميزات Android 8.0 وواجهات برمجة التطبيقات

يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) مجموعة متنوعة من الميزات والإمكانات الجديدة للمستخدمين والمطوّرين. يوضّح هذا المستند الميزات الجديدة للمطوّرين.

احرص أيضًا على الاطّلاع على التغييرات في السلوك في الإصدار 8.0 من نظام التشغيل Android للتعرّف على الجوانب التي قد تؤثر فيها تغييرات النظام الأساسي في تطبيقاتك.

تجربة المستخدم

وضع "نافذة ضمن النافذة"

ميزة "نافذة ضمن النافذة" في الإصدار Android 8.0

يتيح الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) بدء الأنشطة في وضع "نافذة ضمن النافذة" (PIP). PIP هو نوع خاص من أوضاع النوافذ المتعددة، ويتم استخدامه في الغالب لتشغيل الفيديو. كان وضع PIP متاحًا في الأصل لـ Android TV فقط، في حين أتاح Android 8.0 هذه الميزة على أجهزة Android الأخرى.

عندما يكون النشاط في وضع "نافذة ضمن النافذة"، يكون في حالة الإيقاف المؤقت، ولكن من المفترض أن يستمر في عرض المحتوى. ولهذا السبب، يجب التأكّد من أنّ التطبيق لا يوقف التشغيل مؤقتًا في معالج onPause(). بدلاً من ذلك، يجب إيقاف الفيديو مؤقتًا في onStop() واستئناف تشغيله في onStart(). لمزيد من المعلومات، يُرجى الاطّلاع على دورة حياة النوافذ المتعددة.

لتحديد إمكانية استخدام وضع "نافذة داخل النافذة" (PIP) لنشاطك، اضبط android:supportsPictureInPicture على "صحيح" في البيان. (اعتبارًا من الإصدار 8.0 من Android، لن تتطلب ميزة "نافذة ضمن النافذة" (PIP) سمة البيان android:resizeableActivity. ومع ذلك، عليك ضبط android:resizeableActivity على "صحيح" إذا كان نشاطك يتيح أوضاع النوافذ المتعددة الأخرى).

يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عنصرًا جديدًا، وهو PictureInPictureParams، الذي يتم تمريره إلى طرق PIP لتحديد سلوك النشاط عندما يكون في وضع PIP. يحدد هذا الكائن خصائص مثل نسبة العرض إلى الارتفاع المفضلة للنشاط.

يمكن الآن استخدام طرق "نافذة ضمن النافذة" الحالية الموضّحة في قسم إضافة نافذة ضمن النافذة على كل أجهزة Android، وليس فقط على Android TV. علاوة على ذلك، يوفّر الإصدار Android 8.0 الطرق التالية لإتاحة وضع "نافذة داخل النافذة" (PIP):

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): يضع النشاط في وضع "نافذة ضمن النافذة". تحدّد السمة args نسبة العرض إلى الارتفاع للنشاط وإعدادات الضبط الأخرى. إذا كانت أي حقول في args فارغة، سيستخدم النظام القيم التي تم ضبطها في آخر مرة تم فيها طلب Activity.setPictureInPictureParams().

    يتم وضع النشاط المحدد في زاوية من الشاشة، وتتم تعبئة بقية الشاشة بالنشاط السابق الذي كان معروضًا على الشاشة. ينتقل النشاط الذي يدخل في وضع "نافذة ضمن النافذة" (PIP) إلى حالة الإيقاف المؤقت، ولكنه يظل قيد التشغيل. إذا نقر المستخدم على نشاط "نافذة ضمن النافذة"، يعرض النظام قائمة ليتفاعل معها، ولا تصل أي أحداث لمس إلى النشاط عندما يكون في حالة "نافذة ضمن النافذة".

  • Activity.setPictureInPictureParams(): لتعديل إعدادات ضبط نافذة ضمن النافذة (PIP) للنشاط إذا كان النشاط في وضع "نافذة ضمن النافذة" (PIP) حاليًا، سيتم تعديل الإعدادات، ويكون هذا مفيدًا في حال تغيّرت نسبة العرض إلى الارتفاع للنشاط. إذا لم يكن النشاط في وضع "نافذة ضمن النافذة"، سيتم استخدام إعدادات الضبط هذه بغض النظر عن طريقة enterPictureInPictureMode() التي تطلبها.

الإشعارات

في نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، أعدنا تصميم الإشعارات لتوفير طريقة أسهل وأكثر اتساقًا لإدارة سلوك الإشعارات وإعداداتها. وتشمل هذه التغييرات ما يلي:

    إشعار مع الاستمرار في الضغط على القائمة في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)

    يمكن للمستخدمين الضغط مع الاستمرار على رموز مشغّل التطبيقات لعرض الإشعارات في الإصدار Android 8.0.

  • قنوات الإشعارات: يقدّم نظام التشغيل Android 8.0 قنوات إشعارات تتيح لك إنشاء قناة مخصّصة للمستخدم لكل نوع من أنواع الإشعارات التي تريد عرضها. وتشير واجهة المستخدم إلى قنوات الإشعارات على أنّها فئات الإشعارات. للاطّلاع على كيفية تنفيذ قنوات الإشعارات، راجِع إدارة قنوات الإشعارات.
  • نقاط الإشعارات: يتيح نظام التشغيل Android 8.0 إمكانية عرض النقاط أو الشارات على رموز مشغّل التطبيقات. تشير نقاط الإشعارات إلى توفُّر إشعارات لم يغلقها المستخدم أو لم يتخذ أيّ إجراء بشأنها بعد. للاطّلاع على كيفية استخدام نقاط الإشعارات، راجِع شارات الإشعارات.
  • التأجيل: يمكن للمستخدمين تأجيل الإشعارات، ما يؤدي إلى اختفائها لفترة من الوقت قبل ظهورها مجددًا. تظهر الإشعارات مرة أخرى بمستوى الأهمية نفسه الذي كانت تظهر به لأول مرة. يمكن للتطبيقات إزالة إشعار مؤجَّل أو تعديله، ولكن لا يؤدي تعديل هذا الإشعار إلى إعادة ظهوره.
  • مهلة الإشعارات: يمكنك ضبط مهلة عند إنشاء إشعار باستخدام setTimeoutAfter(). يمكنك استخدام هذه الطريقة لتحديد المدة التي يجب إلغاء الإشعار بعد انقضائها. وإذا لزم الأمر، يمكنك إلغاء الإشعار قبل انقضاء مدة المهلة المحدّدة.
  • إعدادات الإشعارات: يمكنك استدعاء setSettingsText() لضبط النص الذي يظهر عند إنشاء رابط إلى إعدادات إشعارات تطبيقك من إشعار باستخدام الغرض من Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. قد يوفّر النظام الإضافات التالية بهدف فلترة الإعدادات التي يجب أن يعرضها تطبيقك للمستخدمين: EXTRA_CHANNEL_ID وNOTIFICATION_TAG وNOTIFICATION_ID.
  • إغلاق الإشعارات: يمكن للمستخدمين إغلاق الإشعارات بأنفسهم، ويمكن للتطبيقات إزالتها بطريقة آلية. يمكنك تحديد وقت تجاهل الإشعار وسبب رفضه من خلال تطبيق طريقة onNotificationRemoved() من الفئة NotificationListenerService.
  • ألوان الخلفية: يمكنك ضبط لون خلفية للإشعار وتفعيله. يجب استخدام هذه الميزة في الإشعارات فقط للمهام الجارية التي يجب أن يراها المستخدم بسرعة. على سبيل المثال، يمكنك ضبط لون خلفية للإشعارات المتعلقة باتجاهات القيادة أو المكالمة الهاتفية الجارية. يمكنك أيضًا ضبط لون الخلفية المطلوب باستخدام setColor(). يتيح لك ذلك استخدام setColorized() لتفعيل استخدام لون الخلفية للإشعار.
  • نمط المراسلة: في الإصدار Android 8.0، تعرض الإشعارات التي تستخدم الفئة MessagingStyle مزيدًا من المحتوى في شكلها المصغَّر. عليك استخدام الفئة MessagingStyle لإرسال الإشعارات المتعلّقة بالمراسلة. ويمكنك أيضًا استخدام طريقة addHistoricMessage() لتوفير سياق للمحادثة من خلال إضافة الرسائل السابقة إلى الإشعارات المتعلقة بالمراسلة.

إطار عمل الملء التلقائي

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

يجعل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عملية ملء النماذج، مثل نماذج تسجيل الدخول وبطاقات الائتمان، أسهل مع طرح إطار عمل الملء التلقائي. تعمل التطبيقات الحالية والجديدة مع إطار عمل الملء التلقائي بعد أن يوافق المستخدم على ميزة الملء التلقائي.

يمكنك اتّخاذ بعض الخطوات لتحسين آلية عمل تطبيقك مع إطار العمل. لمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة على إطار عمل الملء التلقائي.

الخطوط القابلة للتنزيل

يتيح لك الإصداران Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) وAndroid Support Library 26 إمكانية طلب الخطوط من تطبيق موفّر خدمة بدلاً من تجميع الخطوط في حزمة APK أو السماح لحزمة APK بتنزيل الخطوط. تقلّل هذه الميزة من حجم حزمة APK وتزيد من معدّل نجاح تثبيت التطبيقات، وتتيح لعدة تطبيقات مشاركة الخط نفسه.

لمزيد من المعلومات حول تنزيل الخطوط، يمكنك الاطّلاع على الخطوط القابلة للتنزيل.

الخطوط في XML

يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ميزة جديدة وهي "الخطوط في XML" تتيح لك استخدام الخطوط كموارد. هذا يعني أنه ليست هناك حاجة لتجميع الخطوط كمواد عرض. يتم تجميع الخطوط في ملف R وتكون متاحة تلقائيًا في النظام كمورد. يمكنك بعد ذلك الوصول إلى هذه الخطوط بمساعدة نوع مورد جديد، وهو font.

يوفّر الإصدار 26 من Support Library دعمًا كاملاً لهذه الميزة على الأجهزة التي تعمل بالإصدار 14 من واجهة برمجة التطبيقات والإصدارات الأحدث.

لمزيد من المعلومات، حول استخدام الخطوط كموارد واسترداد خطوط النظام، راجع الخطوط في XML.

تغيير حجم عرض النص تلقائيًا

يتيح لك الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ضبط حجم توسيع النص أو تعاقده تلقائيًا استنادًا إلى حجم TextView. وهذا يعني أنّه من الأسهل بكثير تحسين حجم النص على شاشات مختلفة أو باستخدام محتوى ديناميكي. لمعرفة المزيد من المعلومات حول ضبط حجم TextView تلقائيًا في الإصدار Android 8.0، يُرجى الاطّلاع على تغيير حجم TextView تلقائيًا.

الرموز التكيُّفية

يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) رموز مشغّلات التطبيقات التكيُّفية. تتيح الرموز التكيُّفية التأثيرات البصرية، ويمكنها عرض مجموعة متنوعة من الأشكال على طُرز الأجهزة المختلفة. للتعرّف على طريقة إنشاء الرموز التكيُّفية، يمكنك الاطّلاع على دليل الرموز التكيُّفية.

إدارة الألوان

يمكن الآن لمطوّري تطبيقات التصوير المتوافقة مع Android الاستفادة من الأجهزة الجديدة التي تتضمن شاشات ذات ألوان واسعة. لعرض الصور ذات النطاق العريض، ستحتاج التطبيقات إلى تفعيل علامة في ملف البيان (لكل نشاط) وتحميل الصور النقطية بملف تعريف ألوان عريضة مضمَّن (AdobeRGB أو Pro Photo RGB أو DCI-P3 أو غير ذلك).

واجهات برمجة تطبيقات WebView

يوفّر Android 8.0 عدة واجهات برمجة تطبيقات لمساعدتك في إدارة عناصر WebView التي تعرض محتوى الويب في تطبيقك. وتشمل واجهات برمجة التطبيقات هذه التي تعمل على تحسين استقرار تطبيقك وأمانه ما يلي:

  • واجهة برمجة تطبيقات الإصدار
  • واجهة برمجة تطبيقات Google SafeBrowsing
  • واجهة برمجة تطبيقات معالجة الإنهاء
  • واجهة برمجة تطبيقات أهمية Renderer

لمعرفة المزيد من المعلومات عن كيفية استخدام واجهات برمجة التطبيقات هذه، يُرجى الاطّلاع على إدارة مكوّنات WebView.

أصبح الصف WebView يتضمّن الآن واجهة برمجة تطبيقات للتصفّح الآمن بهدف تعزيز أمان التصفّح على الويب. لمزيد من المعلومات، يُرجى الاطّلاع على واجهة برمجة تطبيقات Google للتصفح الآمن.

تثبيت الاختصارات والتطبيقات المصغّرة

يوفّر الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) إمكانية تثبيت الاختصارات والتطبيقات المصغّرة داخل التطبيق. في تطبيقك، يمكنك إنشاء اختصارات وتطبيقات مصغّرة مثبّتة لمشغّلات التطبيقات المتوافقة، ويخضع ذلك لإذن المستخدم.

لمزيد من المعلومات، اطّلِع على دليل ميزة تثبيت الاختصارات والتطبيقات المصغّرة.

الحد الأقصى لنسبة العرض إلى الارتفاع في الشاشة

يتضمّن الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تغييرات في كيفية ضبط الحد الأقصى لنسبة العرض إلى الارتفاع للتطبيق.

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

لمزيد من المعلومات حول تعريف الحد الأقصى لنسبة العرض إلى الارتفاع، راجِع القسم إتاحة الشاشات المتعدّدة.

دعم الشاشات المتعددة

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

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

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

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

توفّر ActivityOptions طريقتين جديدتين لإتاحة استخدام عدة شاشات:

setLaunchDisplayId()
يحدد هذا الإعداد شاشة العرض التي يجب أن يظهر النشاط عليها عند إطلاقه.
getLaunchDisplayId()
لعرض شاشة الإطلاق الحالية للنشاط.

تم توسيع وحدة التحكّم في Adb لتتوافق مع شاشات العرض المتعدّدة. يمكن الآن استخدام الأمر shell start لبدء نشاط معيّن ولتحديد الشاشة المستهدَفة للنشاط:

adb shell start <activity_name> --display <display_id>

هوامش تنسيق موحَّد والمساحة المتروكة

يسهّل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تحديد الحالات التي تستخدم فيها الجوانب المقابلة لعنصر View نفس الهامش أو المساحة المتروكة. يمكنك الآن على وجه التحديد الآن استخدام السمات التالية في ملفات XML للتنسيق:

ملاحظة: في حال تخصيص منطق تطبيقك ليتوافق مع اللغات والثقافات المختلفة، بما في ذلك اتجاه النص، يُرجى العلم أنّ هذه السمات لا تؤثر في قيم layout_marginStart أو layout_marginEnd أو paddingStart أو paddingEnd. يمكنك تعيين هذه القيم بنفسك، بالإضافة إلى سمات التنسيق العمودي والأفقي الجديدة، لإنشاء سلوك التنسيق الذي يعتمد على اتجاه النص.

التقاط المؤشر

تستفيد بعض التطبيقات، مثل الألعاب وسطح المكتب البعيد وبرامج المحاكاة الافتراضية، بشكل كبير من التحكّم في مؤشر الماوس. ميزة "التقاط المؤشر" هي ميزة جديدة في نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) وتوفّر هذه الميزة للتحكّم من خلال عرض جميع أحداث الماوس في طريقة عرض مركّزة في تطبيقك.

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

للحصول على معلومات حول طريقة استخدام هذه الميزة في تطبيقك، يُرجى الاطّلاع على التقاط المؤشر.

فئات التطبيقات

يسمح Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) لكل تطبيق بإعلان الفئة التي يناسبها، عند الاقتضاء. تُستخدَم هذه الفئات لتجميع التطبيقات ذات الغرض أو الوظائف المتشابهة معًا عند عرضها على المستخدمين، مثل استخدام البيانات أو استخدام البطارية أو استخدام مساحة التخزين. يمكنك تحديد فئة لتطبيقك عن طريق ضبط السمة android:appCategory في علامة البيان <application>.

مشغّل تطبيقات Android TV

يوفّر Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تجربة جديدة ترتكز على المحتوى وتجربة الشاشة الرئيسية لـ Android TV، وتتوفر مع محاكي Android TV وصورة جهاز Nexus Player لنظام التشغيل Android 8.0. تنظم الشاشة الرئيسية الجديدة محتوى الفيديو في صفوف مقابلة للقنوات، والتي يملأ كل منها برامج بواسطة تطبيق على النظام. يمكن للتطبيقات نشر قنوات متعددة، ويمكن للمستخدمين ضبط القنوات التي يريدون مشاهدتها على الشاشة الرئيسية. تتضمن شاشة Android TV الرئيسية أيضًا صف "مشاهدة التالي" الذي تتم تعبئته ببرامج من التطبيقات استنادًا إلى عادات المشاهدة لدى المستخدم. يمكن أن توفر التطبيقات أيضًا معاينات للفيديو، يتم تشغيلها تلقائيًا عندما يركز المستخدم على برنامج. تُعدّ واجهات برمجة التطبيقات لتعبئة القنوات والبرامج جزءًا من واجهات برمجة تطبيقات TvProvider التي يتم توزيعها كوحدة "مكتبة دعم Android" بنظام التشغيل Android 8.0.

مجموعة صور متحركة

بدءًا من الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، تتيح واجهة برمجة التطبيقات AnimatorSet API الآن وضع التقديم/الترجيع والتشغيل العكسي. يتيح لك التقديم/الترجيع تعيين موضع الرسوم المتحركة على نقطة زمنية محددة. يكون التشغيل العكسي مفيدًا إذا كان تطبيقك يشتمل على رسوم متحركة للإجراءات التي يمكن التراجع عنها. بدلاً من تحديد مجموعتين منفصلتين من الرسوم المتحركة، يمكنك تشغيل نفس المجموعة بشكل عكسي.

الإدخال والتنقل

مجموعات التنقّل باستخدام لوحة المفاتيح

إذا كان أحد الأنشطة في تطبيقك يستخدم تسلسلاً هرميًا معقدًا لطريقة العرض، مثل النشاط الوارد في الشكل 2، يمكنك تنظيم مجموعات من عناصر واجهة المستخدم في مجموعات لتسهيل التنقل باستخدام لوحة المفاتيح بينها. يمكن للمستخدمين الضغط على Meta+Tab أو البحث +Tab على أجهزة Chromebook للانتقال من مجموعة إلى أخرى. تتضمن الأمثلة الجيدة للمجموعات ما يلي: اللوحات الجانبية وأشرطة التنقل ومناطق المحتوى الرئيسية والعناصر التي يمكن أن تحتوي على العديد من العناصر الفرعية.

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

لجعل العنصر View أو ViewGroup مجموعة، اضبط السمة android:keyboardNavigationCluster على true في ملف XML الخاص بتنسيق العنصر، أو اضبط true إلى setKeyboardNavigationCluster() في منطق واجهة المستخدم الخاصة بتطبيقك.

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

على الأجهزة التي تحتوي على شاشات تعمل باللمس، يمكنك ضبط العنصر android:touchscreenBlocksFocus لكائن ViewGroup المعيَّن في مجموعة على true للسماح بالتنقل في المجموعة فقط من وإلى تلك المجموعة وخارجها. في حال تطبيق هذه الإعدادات على مجموعة، لا يمكن للمستخدمين استخدام مفتاح التبويب (Tab) أو مفاتيح الأسهم للتنقل داخل المجموعة أو خارجها، بل عليهم الضغط على مجموعة لوحة مفاتيح التنقّل في المجموعة بدلاً من ذلك.

عرض التركيز التلقائي

في نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك تخصيص View الذي يجب التركيز عليه بعد استئناف النشاط (إعادة) الذي تم إنشاؤه وضغط المستخدم على مفتاح التنقّل في لوحة المفاتيح، مثل مفتاح التبويب (Tab). لتطبيق هذا الإعداد "يتم التركيز عليه تلقائيًا"، عليك ضبط السمة android:focusedByDefault الخاصة بالعنصر View على true في ملف XML للتنسيق يحتوي على عنصر واجهة المستخدم أو ضبط النص في true على setFocusedByDefault() في منطق واجهة المستخدم الخاصة بالتطبيق.

تحويل النص إلى كلام

ويمكن للأنشطة والخدمات استخدام مثيلات TextToSpeech لإملاء المحتوى ونطقه. بدءًا من نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكن لتطبيقك الحصول على معلومات أكثر دقة عن التوقيت الذي يبدأ فيه محرّك تحويل النص إلى كلام في نطق كلمات مركّبة فردية، طالما أنّ المحرّك يوفّر هذه المعلومات. يمكنك استخدام هذه الوظيفة للفت الانتباه إلى كلمات محددة أثناء نطقها من خلال محرك تحويل النص إلى كلام.

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

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

لمزيد من المعلومات حول تتبُّع تقدّم التشغيل لمحرك تحويل النص إلى كلام، راجِع مرجع الفئة UtteranceProgressListener.

النظام

أدوات رصد مضبوطة للوضع الصارم

يضيف نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ثلاثة أدوات رصد جديدة لوضع StrictMode للمساعدة في تحديد الأخطاء المحتملة في تطبيقك:

  • سيرصد detectUnbufferedIo() الوقت الذي يقرأ فيه تطبيقك البيانات أو يكتبها بدون تخزين مؤقت، ما قد يؤثر بشكل كبير في الأداء.
  • سيرصد "detectContentUriWithoutPermission()" الحالات التي ينسى فيها تطبيقك عن طريق الخطأ منح الأذونات لتطبيق آخر عند بدء نشاط خارج التطبيق.
  • سيرصد "detectUntaggedSockets()" الحالات التي ينفّذ فيها تطبيقك حركة بيانات الشبكة بدون استخدام setThreadStatsTag(int) لوضع علامة على حركة البيانات لأغراض تصحيح الأخطاء.

البيانات المؤقتة

يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) إرشادات وسلوكيات أفضل بشأن البيانات المخزَّنة مؤقتًا. يتم الآن منح كل تطبيق حصة من مساحة القرص للبيانات المخزَّنة مؤقتًا كما يتم عرضها بواسطة getCacheQuotaBytes(UUID).

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

هناك أيضًا سلوكان جديدان يمكنك تفعيلهما على أساس كل دليل للتحكّم في كيفية تفريغ النظام من بياناتك المخزَّنة مؤقتًا:

  • يمكن استخدام StorageManager.setCacheBehaviorAtomic() للإشارة إلى ضرورة حذف دليل وكل محتواه كوحدة صغيرة واحدة.
  • يمكن استخدام setCacheBehaviorTombstone(File, boolean) للإشارة إلى أنّه بدلاً من حذف الملفات داخل الدليل، يجب اقتطاعها ليكون طولها 0 بايت، ما يؤدي إلى ترك الملف الفارغ بدون تغيير.

أخيرًا، عندما تحتاج إلى تخصيص مساحة على القرص للملفات الكبيرة، ننصحك باستخدام واجهة allocateBytes(FileDescriptor, long) API الجديدة التي ستمحو تلقائيًا الملفات المخزَّنة مؤقتًا التي تنتمي إلى تطبيقات أخرى (حسب الحاجة) لتلبية طلبك. عند تحديد ما إذا كان الجهاز به مساحة كافية على القرص للاحتفاظ بالبيانات الجديدة، اطلب الرمز getAllocatableBytes(UUID) بدلاً من استخدام getUsableSpace()، لأنّ الأول سيأخذ في الاعتبار أي بيانات مخزَّنة مؤقتًا يريد النظام محوها نيابةً عنك.

نقل بيانات موفّر المحتوى

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

للحصول على معلومات مفصّلة عن التغييرات التي طرأت على موفّري المحتوى، يمكنك الاطّلاع على ContentProvider وContentProviderClient.

طلبات تحديث المحتوى

يتضمّن كل من الصفَّين ContentProvider وContentResolver الآن طريقة refresh()، ما يسهّل على العملاء معرفة ما إذا كانت المعلومات التي يطلبونها حديثة.

يمكنك إضافة منطق إعادة تحميل محتوى مخصّص من خلال توسيع نطاق ContentProvider. احرِص على إلغاء طريقة refresh() لعرض true، مع الإشارة إلى عملاء مقدّم الخدمة بأنّك حاولت إعادة تحميل البيانات بنفسك.

يمكن لتطبيق العميل أن يطلب صراحةً إعادة تحميل المحتوى من خلال استدعاء طريقة مختلفة تُعرف أيضًا باسم refresh(). عند استدعاء هذه الطريقة، أدخل معرف الموارد المنتظم (URI) للبيانات للتحديث.

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

تحسينات JobScheduler

يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عددًا من التحسينات على JobScheduler. تسهّل هذه التحسينات على تطبيقك الامتثال لحدود التنفيذ في الخلفية الجديدة، إذ يمكنك بشكل عام استخدام المهام المُجدوَلة لاستبدال خدمات الخلفية المفروض عليها قيود حاليًا أو أجهزة استقبال البث الضمنية.

تشمل التعديلات على "JobScheduler" ما يلي:

  • يمكنك الآن ربط قائمة انتظار العمل بمهمة مُجدوَلة. لإضافة عنصر عمل إلى قائمة انتظار الوظيفة، اتصل بالرقم JobScheduler.enqueue(). عند تشغيل المهمة، يمكن إزالة العمل المعلّق من قائمة الانتظار ومعالجته. تعالج هذه الوظيفة العديد من حالات الاستخدام التي كانت تستدعي في السابق بدء خدمة في الخلفية، وخاصةً الخدمات التي تطبّق IntentService.
  • يقدّم Android Support Library 26.0.0 فئة JobIntentService جديدة توفّر الوظائف نفسها المتوفّرة في IntentService ولكنها تستخدم المهام بدلاً من الخدمات عند تشغيلها على الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث.
  • يمكنك الآن الاتصال بالرقم JobInfo.Builder.setClipData() لربط ClipData بوظيفة. يتيح لك هذا الخيار ربط عمليات منح أذونات معرّف الموارد المنتظم (URI) بوظيفة ما، بالطريقة نفسها التي يتم بها نشر هذه الأذونات في Context.startService(). يمكنك أيضًا استخدام منح أذونات معرف الموارد المنتظم (URI) لأغراض على قوائم انتظار العمل.
  • أصبحت المهام المُجدوَلة الآن متوافقة مع عدّة قيود جديدة:
    JobInfo.isRequireStorageNotLow()
    لا تعمل المهمة إذا كانت مساحة التخزين المتاحة في الجهاز منخفضة.
    JobInfo.isRequireBatteryNotLow()
    ولا تعمل المهمة إذا كان مستوى شحن البطارية عند الحد الأدنى الحرج أو أقل منه، هذا هو المستوى الذي يعرض فيه الجهاز مربع حوار النظام تحذير بشأن انخفاض مستوى شحن البطارية.
    NETWORK_TYPE_METERED
    تتطلّب المهمة اتصالاً بشبكة تفرض تكلفة استخدام، مثل معظم خطط بيانات شبكة الجوّال.

مخزن بيانات مخصّص

يتيح لك الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) توفير متجر بيانات مخصّص لإعداداتك المفضّلة، ما قد يفيدك إذا كان تطبيقك يخزّن الإعدادات المفضّلة في قاعدة بيانات محلية أو على السحابة الإلكترونية، أو إذا كانت الإعدادات المفضّلة خاصة بالجهاز. لمزيد من المعلومات حول تنفيذ متجر البيانات، يُرجى الرجوع إلى مخزن البيانات المخصّص.

تحسينات الوسائط

أداة تغيير الحجم

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

تحسينات التركيز على الصوت

تشارك تطبيقات الصوت إخراج الصوت على الجهاز من خلال طلب تركيز الصوت وإيقافه. يعالج التطبيق التغييرات التي تطرأ على التركيز من خلال بدء تشغيله أو إيقافه أو خفض مستوى صوته. يتوفّر صف جديد في "AudioFocusRequest". عند استخدام هذه الفئة كمَعلمة للسمة requestAudioFocus()، تتضمّن التطبيقات إمكانيات جديدة عند التعامل مع التغييرات في تركيز الصوت: تجنّب التداخل تلقائيًا وزيادة التركيز المتأخر.

مقاييس الوسائط

تعرض طريقة getMetrics() الجديدة عنصر PersistableBundle يحتوي على معلومات الإعدادات والأداء، ويتم التعبير عنه كخريطة للسمات والقيم. يتم تحديد طريقة getMetrics() للفئات الإعلامية التالية:

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

مشغّل الوسائط

بدءًا من نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) يمكن لتطبيق MediaPlayer تشغيل مواد محمية بموجب إدارة الحقوق الرقمية ووسائط HLS مشفّرة على مستوى العينة.

يقدّم Android 8.0 أمر seekTo() جديداً يوفّر تحميلاً زائدًا، وهو يتيح التحكم بشكل أكثر دقة عند البحث عن إطار. ويتضمن معلمة ثانية تحدد وضع البحث:

  • وتنقل العلامة SEEK_PREVIOUS_SYNC موضع الوسائط إلى إطار مزامنة (أو مفتاح) مرتبط بمصدر بيانات يقع قبل أو في الوقت المحدّد مباشرةً.
  • وتنقل العلامة SEEK_NEXT_SYNC موضع الوسائط إلى إطار مزامنة (أو مفتاح) مرتبط بمصدر بيانات يقع بعد أو في الوقت المحدّد مباشرةً.
  • وتنقل العلامة SEEK_CLOSEST_SYNC موضع الوسائط إلى إطار مزامنة (أو مفتاح) مرتبط بمصدر بيانات يقع الأقرب إلى النطاق الزمني المحدّد أو في الوقت نفسه.
  • وتنقل العلامة SEEK_CLOSEST موضع الوسائط إلى إطار (ليس بالضرورة مزامنة أو إطار مفتاح) مرتبط بمصدر بيانات يقع في أقرب وقت أو في الوقت المحدّد.

عند تقديم/ترجيع الفيديو باستمرار، يجب أن تستخدم التطبيقات أيًا من أوضاع SEEK_ بدلاً من SEEK_CLOSEST، حيث يعمل هذا الوضع أبطأ نسبيًا ولكن قد يكون أكثر دقة.

أداة تسجيل الوسائط

  • تتيح أداة MediaRecorder الآن استخدام تنسيق MPEG2_TS المفيد للبث:

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
    

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
    

    الاطّلاع على MediaRecorder.OutputFormat

  • بإمكان "MediaMuxer" الآن معالجة أي عدد من عمليات بث الصوت والفيديو. لم تعُد تقتصر على مقطع صوتي واحد و/أو مقطع فيديو واحد. استخدم addTrack() لمزج أي عدد تريده من المقاطع الصوتية.
  • يمكن لـ MediaMuxer أيضًا إضافة مسار بيانات وصفية واحد أو أكثر يتضمن معلومات يحددها المستخدم لكل إطار. يحدّد تطبيقك تنسيق البيانات الوصفية. إنّ مسار البيانات الوصفية متوافق فقط مع حاويات MP4.

يمكن أن تكون البيانات الوصفية مفيدة للمعالجة بلا اتصال بالإنترنت. على سبيل المثال، يمكن استخدام إشارات الجيروسكوب من أداة الاستشعار لإجراء تثبيت الفيديو.

عند إضافة مسار بيانات وصفية، يجب أن يبدأ تنسيق MIME للمسار بالبادئة "application/". وكتابة البيانات الوصفية هي نفسها كتابة بيانات الفيديو/الصوت، إلا أنّ البيانات ليست واردة من MediaCodec. بدلاً من ذلك، يمرّر التطبيق ByteBuffer مع طابع زمني مرتبط إلى طريقة writeSampleData(). يجب أن يكون الطابع الزمني في الوقت نفسه الخاص بالمقطع الصوتي والفيديو.

يستخدم ملف MP4 الذي تم إنشاؤه TextMetaDataSampleEntry المحدّد في القسم 12.3.3.2 من ISOBMFF للإشارة إلى تنسيق MIME للبيانات الوصفية. عند استخدام MediaExtractor لاستخراج الملف الذي يحتوي على مسار بيانات وصفية، سيتم استخراج تنسيق MIME للبيانات الوصفية إلى MediaFormat.

تحسين إمكانية الوصول إلى ملفات الوسائط

يُتيح إطار عمل الوصول إلى مساحة التخزين (SAF) للتطبيقات عرض DocumentsProvider مخصّص، ما يتيح للتطبيقات الأخرى الوصول إلى ملفات في مصدر بيانات. وفي الواقع، قد يوفّر موفّر المستندات إمكانية الوصول إلى الملفات الموجودة على مساحة تخزين الشبكة أو التي تستخدم بروتوكولاً مثل بروتوكول نقل الوسائط (MTP).

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

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

يعالج Android 8.0 كل من هذه التحديات من خلال تحسين "إطار عمل الوصول إلى مساحة التخزين".

موفِّرو المستندات المخصَّصة

بدءًا من الإصدار Android 8.0، يسمح "إطار عمل الوصول إلى مساحة التخزين" لمقدّمي المستندات المخصّصة بإنشاء أدوات وصف للملفات يمكن الوصول إليها في مصدر بيانات بعيد. يمكن لـ SAF فتح ملف للحصول على واصف ملف أصلي يمكن البحث عنه. ثم يسلم SAF طلبات بايت منفصلة إلى موفّر المستندات. تتيح هذه الميزة لموفر المستندات عرض النطاق الدقيق لوحدات البايت التي طلبها تطبيق مشغِّل الوسائط عوضًا عن التخزين المؤقت للملف بالكامل مقدَّمًا.

لاستخدام هذه الميزة، عليك طلب طريقة StorageManager.openProxyFileDescriptor() الجديدة. تقبل الطريقة openProxyFileDescriptor() عنصر ProxyFileDescriptorCallback كاستدعاء. يستدعي SAF معاودة الاتصال في أي وقت يجري فيه تطبيق عميل عمليات ملف على واصف الملفات الذي يتم عرضه من موفر المستندات.

الوصول المباشر إلى المستندات

بدءًا من الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك استخدام طريقة getDocumentUri() للحصول على معرّف موارد منتظم (URI) يشير إلى المستند نفسه الذي يتضمّن mediaUri المحدَّد. ولأنّ معرّف الموارد المنتظم (URI) المعروض يستند إلى DocumentsProvider، يمكن لمديري مجموعات الوسائط الوصول إلى المستند مباشرةً، بدون الحاجة إلى فحص الأشجار من الأدلة ذات النطاق. ونتيجةً لذلك، يمكن لمديري الوسائط إجراء عمليات على الملفات على المستند بسرعة أكبر بكثير.

تنبيه: تحدّد الطريقة getDocumentUri() موقع ملفات الوسائط فقط، ولا تمنح التطبيقات الإذن بالوصول إلى هذه الملفات. لمعرفة المزيد من المعلومات حول كيفية الحصول على إذن الوصول إلى ملفات الوسائط، راجع الوثائق المرجعية.

المسارات إلى المستندات

عند استخدام "إطار عمل الوصول إلى مساحة التخزين" في Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك استخدام طريقة findDocumentPath() المتاحة في فئتَي DocumentsContract وDocumentsProvider لتحديد المسار من جذر نظام الملفات باستخدام معرّف المستند. وتُرجع الطريقة هذا المسار في كائن DocumentsContract.Path. في الحالات التي يشتمل فيها نظام الملفات على عدة مسارات محددة لنفس المستند، تُرجع الطريقة المسار الأكثر استخدامًا للوصول إلى المستند بالمعرف المحدد.

وهذه الوظيفة مفيدة بشكل خاص في السيناريوهات التالية:

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

ملاحظة: إذا كان لدى تطبيقك إذن بالوصول إلى بعض المستندات فقط في المسار، لن تتضمّن القيمة المعروضة findDocumentPath() سوى المجلدات والمستندات التي يمكن لتطبيقك الوصول إليها.

مراقبة تشغيل الصوت

تحتفظ خدمة نظام AudioManager بقائمة بكائنات AudioPlaybackConfiguration النشطة، ويحتوي كل منها على معلومات حول جلسة تشغيل صوت معيّنة. يمكن لتطبيقك استرداد مجموعة عمليات الضبط النشطة حاليًا عن طريق طلب رمز getActivePlaybackConfigurations().

بدءًا من الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك تسجيل معاودة اتصال لإرسال إشعار إلى تطبيقك عند تغيير عنصر واحد أو أكثر من عناصر AudioPlaybackConfiguration. لإجراء ذلك، يجب استدعاء registerAudioPlaybackCallback()، مع تمرير مثيل AudioManager.AudioPlaybackCallback. تحتوي الفئة AudioManager.AudioPlaybackCallback على الطريقة onPlaybackConfigChanged() التي يستدعيها النظام عند تغيير إعدادات تشغيل الصوت.

إمكانية الاتصال

Wi-Fi Aware

يتوافق نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) مع خدمة Wi-Fi Aware التي تستند إلى مواصفات شبكة التجّار (NAN). على الأجهزة المزوّدة بـ Wi-Fi Aware المناسب، يمكن للتطبيقات والأجهزة المجاورة الاكتشاف والتواصل عبر Wi-Fi بدون نقطة اتصال بالإنترنت. نعمل مع شركاء الأجهزة لتوفير تقنية Wi-Fi Aware على الأجهزة في أقرب وقت ممكن. للحصول على معلومات حول طريقة دمج خدمة Wi-Fi Aware في تطبيقك، يُرجى الاطّلاع على Wi-Fi Aware.

البلوتوث

يوفّر Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) إمكانية استخدام البلوتوث بشكل أفضل في النظام الأساسي من خلال إضافة الميزات التالية:

  • دعم معيار AVRCP 1.4، الذي يمكِّن تصفح مكتبة الأغاني.
  • التوافق مع الإصدار 5.0 من تقنية البلوتوث المنخفض الطاقة (BLE)
  • تكامل برنامج ترميز Sony LDAC في حزمة Bluetooth.

إقران الجهاز المصاحب

يوفّر Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) واجهات برمجة تطبيقات تتيح لك تخصيص مربّع حوار طلب الإقران عند محاولة الإقران مع الأجهزة المرتبطة عبر البلوتوث وتقنية BLE وWi-Fi. ولمزيد من المعلومات، يُرجى الاطّلاع على إقران الأجهزة المصاحبة.

لمزيد من المعلومات حول استخدام البلوتوث على Android، يُرجى مراجعة دليل البلوتوث. بالنسبة إلى التغييرات التي تطرأ على البلوتوث تحديدًا للإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، يُرجى الاطّلاع على قسم البلوتوث في صفحة تغييرات السلوك في الإصدار 8.0 من نظام التشغيل Android.

المشاركة

المشاركة الذكية

يتعرّف Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) على خيارات المشاركة المفضّلة للمستخدمين ويفهم بشكل أفضل كل نوع من أنواع المحتوى التي تُعد التطبيقات المناسبة التي يمكن المشاركة معها. على سبيل المثال، إذا التقط المستخدم صورة لإيصال، يمكن أن يقترح نظام التشغيل Android 8.0 تطبيق لتتبُّع النفقات. أما إذا التقط المستخدم صورة ذاتية، فيمكن لتطبيق وسائل التواصل الاجتماعي التعامل مع الصورة بشكل أفضل. يتعرف Android 8.0 تلقائيًا على كل هذه الأنماط وفقًا لتفضيلات المستخدمين المخصصة.

تعمل ميزة "المشاركة الذكية" مع أنواع من المحتوى غير image، مثل audio وvideo وtext وURL وغير ذلك.

لتفعيل ميزة "المشاركة الذكية"، أضِف ArrayList تعليقات توضيحية يصل عددها إلى ثلاث سلاسل إلى الغرض الذي يشارك المحتوى. يجب أن تصف التعليقات التوضيحية المكونات أو الموضوعات الرئيسية في المحتوى. يوضّح مثال الرمز البرمجي التالي كيفية إضافة تعليقات توضيحية إلى الغرض:

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

للحصول على معلومات تفصيلية حول التعليقات التوضيحية للمشاركة الذكية، يُرجى الاطّلاع على EXTRA_CONTENT_ANNOTATIONS.

أداة تصنيف النص

على الأجهزة المتوافقة، يمكن للتطبيقات استخدام Text Classifier جديد للتحقّق مما إذا كانت السلسلة تتطابق مع نوع كيان معروف ضمن المصنِّف والحصول على بدائل مقترَحة. تتضمن الكيانات التي يتعرف عليها النظام العناوين وعناوين URL وأرقام الهواتف وعناوين البريد الإلكتروني. لمزيد من المعلومات، يُرجى الاطّلاع على TextClassifier.

تسهيل الاستخدام

يتوافق Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) مع العديد من ميزات تسهيل الاستخدام الجديدة للمطوّرين الذين ينشئون خدمات تسهيل الاستخدام الخاصة بهم:

للاطّلاع على مزيد من المعلومات حول كيفية تسهيل استخدام تطبيقك، راجِع تسهيل الاستخدام.

الأمان والخصوصية

الأذونات

يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) العديد من الأذونات الجديدة المتعلّقة بالاتصال الهاتفي:

  • يسمح الإذن ANSWER_PHONE_CALLS لتطبيقك بالرد على المكالمات الهاتفية الواردة آليًا. لمعالجة مكالمة هاتفية واردة في تطبيقك، يمكنك استخدام طريقة acceptRingingCall().
  • يمنح إذن READ_PHONE_NUMBERS تطبيقك الإذن بالاطّلاع على أرقام الهواتف المخزّنة في جهاز.

يُصنَّف هذان الإذنان على أنّهما خطير وهما جزء من مجموعة أذونات PHONE.

واجهات برمجة تطبيقات جديدة للوصول إلى الحسابات واكتشافها

يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) العديد من التحسينات على كيفية وصول التطبيقات إلى حسابات المستخدمين. بالنسبة إلى الحسابات التي يديرونها، يمكن لجهات التوثيق استخدام سياستها الخاصة لتحديد ما إذا كانت تريد إخفاء الحسابات من أحد التطبيقات أو الكشف عنها. ويتتبّع نظام Android التطبيقات التي يمكنها الوصول إلى حساب معيّن.

في الإصدارات السابقة من Android، كان على التطبيقات التي تريد تتبُّع قائمة حسابات المستخدمين أن تتلقّى تحديثات حول جميع الحسابات، بما في ذلك الحسابات ذات الأنواع غير ذات الصلة. يضيف نظام التشغيل Android 8.0 الطريقة addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) التي تتيح للتطبيقات تحديد قائمة بأنواع الحسابات التي يجب تلقّي تغييرات الحساب لها.

التغييرات في واجهة برمجة التطبيقات

يوفّر AccountManager ست طرق جديدة لمساعدة برامج المصادقة على إدارة التطبيقات التي يمكنها رؤية حساب:

يقدّم Android 8.0 (مستوى واجهة برمجة التطبيقات 26) قيمتَين خاصتَين لاسم الحزمة لتحديد مستويات الظهور للتطبيقات التي لم يتم ضبطها باستخدام الطريقة setAccountVisibility(android.accounts.Account, java.lang.String, int). يتم تطبيق PACKAGE_NAME_KEY_LEGACY_VISIBLE قيمة إذن الوصول على التطبيقات التي حصلت على الإذن "GET_ACCOUNTS" وإصدارات Android المستهدفة الأقدم من الإصدار 8.0 من Android أو التي تتطابق توقيعاتها مع برنامج المصادقة الذي يستهدف أي إصدار من Android. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE يوفر قيمة تلقائية لإذن الوصول للتطبيقات التي لم يتم ضبطها سابقًا والتي لا ينطبق عليها PACKAGE_NAME_KEY_LEGACY_VISIBLE.

لمزيد من المعلومات حول واجهات برمجة التطبيقات الجديدة للوصول إلى الحساب واكتشافه، يمكنك الاطّلاع على مرجع AccountManager وOnAccountsUpdateListener.

الاختبار

اختبار قياس حالة التطبيق بشأن الأجهزة

يوفّر Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) الدعم الإضافي التالي لاختبارات أدوات التطبيق.

التشغيل من عمليات التطبيق غير التلقائية

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

لتحديد أداة العملية غير التلقائية، انتقِل إلى ملف البيان ثم إلى عنصر <instrumentation> المطلوب. أضِف السمة android:targetProcess واضبط قيمتها على أي مما يلي:

  • اسم عملية معينة.
  • قائمة بأسماء العمليات مفصولة بفواصل.
  • حرف بدل ("*")، يسمح بتشغيل الأداة مقابل أي عملية يتم إطلاقها تنفّذ رمزًا في الحزمة المحدَّدة في السمة android:targetPackage.

أثناء تنفيذ اختبار الأدوات، يمكنك التحقق من العملية التي يتم اختبارها عن طريق طلب البيانات من getProcessName().

الإبلاغ عن النتائج أثناء الاختبار

يمكنك الآن الإبلاغ عن النتائج أثناء تنفيذ اختبار قياس حالة التطبيق، بدلاً من الإبلاغ عنه لاحقًا، عن طريق الاتصال بـ addResults().

أغراض وهمية للاختبارات

لتسهيل إنشاء اختبارات منفصلة ومستقلة لواجهة المستخدم عن أنشطة تطبيقك، يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) طريقة onStartActivity(). يمكنك إلغاء هذه الطريقة في فئة فرعية مخصّصة من الفئة Instrumentation.ActivityMonitor لمعالجة هدف معيّن تستدعيه فئة الاختبار.

عندما تستدعي فئة الاختبار الغرض، تعرض الطريقة كائن stub Instrumentation.ActivityResult بدلاً من تنفيذ النية ذاتها. باستخدام منطق الهدف الوهمي هذا في اختباراتك، يمكنك التركيز على كيفية إعداد ومعالجة الغرض من تمريرك إلى نشاط مختلف أو تطبيق مختلف تمامًا.

وقت التشغيل والأدوات

تحسينات النظام الأساسي

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

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

تم تحديث التوافق مع لغة Java

يضيف نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) الدعم للعديد من واجهات برمجة تطبيقات OpenJDK Java الإضافية:

لمعرفة المزيد حول الفئات والطرق ضمن هذه الحزم المضافة حديثًا، راجع الوثائق المرجعية لواجهة برمجة التطبيقات.

إذا أردت استخدام ميزات لغة Java 8 في "استوديو Android"، عليك تنزيل أحدث إصدار من المعاينة.

واجهات برمجة التطبيقات المحدّثة لإطار عمل Android ICU4J

يعمل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) على توسيع واجهة برمجة التطبيقات ICU4J Android APIs، وهي مجموعة فرعية من واجهات برمجة التطبيقات ICU4J، ليستخدمها مطورو التطبيقات ضمن حزمة android.icu. وتستخدم واجهات برمجة التطبيقات هذه بيانات الترجمة المتوفّرة على الجهاز، لذا يمكنك تقليل تأثير APK من خلال عدم تجميع مكتبات ICU4J في حزمة APK.

الجدول 1. إصدارات ICU وCLDR وUnicode المستخدمة في Android

مستوى واجهة برمجة تطبيقات Android إصدار وحدة ICU إصدار CLDR إصدار Unicode
Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) وAndroid 7.1 (المستوى 25 من واجهة برمجة التطبيقات) 56 28 من نظام التشغيل Android
Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) 58.2 30.0.3 9

لمزيد من المعلومات حول التدويل على Android، بما في ذلك دعم ICU4J، راجع الانتشار على نطاق عالمي على Android.

Android Enterprise

تم طرح ميزات جديدة للمؤسسات وواجهات برمجة التطبيقات للأجهزة التي تعمل بنظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات). تشمل أهم التفاصيل ما يلي:

  • تتيح الملفات الشخصية للعمل على الأجهزة المُدارة بالكامل للمؤسسات إمكانية فصل العمل عن البيانات الشخصية مع إدارة كليهما.
  • إنّ تفويض واجهة برمجة التطبيقات يتيح لمالكي الأجهزة ومالكي الملفات الشخصية إسناد إدارة التطبيقات إلى تطبيقات أخرى.
  • إنّ التحسينات على تجربة المستخدم في عملية توفير المتطلبات اللازمة (بما في ذلك خيارات التخصيص الجديدة) تؤدي إلى تقليل وقت الإعداد.
  • تتيح عناصر التحكّم الجديدة عبر البلوتوث وشبكة Wi-Fi والنسخ الاحتياطي والأمان للمؤسسات إدارة المزيد من محتوى الجهاز. ويساعد تسجيل أنشطة الشبكة المؤسسات على تتبُّع المشاكل.

لمعرفة المزيد من المعلومات عن واجهات برمجة التطبيقات والميزات الجديدة الأخرى في Android Enterprise، يُرجى الاطّلاع على Android في Enterprise.