يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) مجموعة متنوعة من الميزات والإمكانات الجديدة للمستخدمين والمطوّرين. يسلّط هذا المستند الضوء على الميزات الجديدة للمطوّرين.
احرص أيضًا على الاطّلاع على التغييرات في السلوك 8.0 في نظام التشغيل Android للتعرّف على الجوانب التي قد تؤثر فيها تغييرات النظام الأساسي في تطبيقاتك.
تجربة المستخدم
وضع "نافذة ضمن النافذة"
الميزة "نافذة ضمن النافذة" في الإصدار Android 8.0.
يتيح الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) بدء الأنشطة في وضع "نافذة ضمن النافذة" (PIP). إنّ PIP هو نوع خاص من أوضاع النوافذ المتعددة يُستخدم في الغالب لتشغيل الفيديو. كان وضع "نافذة داخل النافذة" (PIP) متوفرًا في الأصل لأجهزة Android TV فقط، في حين أنّ الإصدار 8.0 من نظام التشغيل Android يتيح هذه الميزة على أجهزة Android الأخرى.
عندما يكون النشاط في وضع "نافذة ضمن النافذة" (PIP)، يكون في حالة الإيقاف المؤقت، ولكن من المفترض
أن يستمر في عرض المحتوى. لهذا السبب، يجب التأكّد من أنّ التطبيق
لا يتوقّف مؤقتًا عن التشغيل في معالج 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 قنوات إشعارات تتيح لك إنشاء قناة مخصّصة للمستخدم لكل نوع من الإشعارات التي تريد عرضها. تشير واجهة المستخدم إلى قنوات الإشعارات على أنّها فئات إشعارات. للاطّلاع على كيفية تطبيق قنوات الإشعارات، راجِع إدارة قنوات الإشعارات.
- نقاط الإشعارات: يتيح نظام التشغيل 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 من واجهة برمجة التطبيقات).](https://developer.android.google.cn/static/images/about/versions/oreo/notification-long-press.png?authuser=8&hl=ar)
يمكن للمستخدمين الضغط مع الاستمرار على رموز مشغّل التطبيقات لعرض الإشعارات في نظام التشغيل Android 8.0.
إطار عمل الملء التلقائي
تستغرق معاملات إنشاء الحسابات وتسجيل الدخول وبطاقات الائتمان وقتًا طويلاً، وهي عرضة للأخطاء. يمكن أن يصاب المستخدمون بسهولة بالإحباط من التطبيقات التي تتطلب هذه الأنواع من المهام المتكررة.
يجعل نظام Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عملية ملء النماذج، مثل تسجيل الدخول ونماذج بطاقات الائتمان، أكثر سهولة من خلال طرح إطار عمل الملء التلقائي. تعمل التطبيقات الحالية والجديدة مع إطار عمل ميزة الملء التلقائي بعد أن يفعّل المستخدم ميزة الملء التلقائي.
يمكنك اتّخاذ بعض الخطوات لتحسين آلية عمل تطبيقك مع إطار العمل. لمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة على إطار عمل الملء التلقائي.
الخطوط القابلة للتنزيل
يتيح لك الإصداران Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) والإصدار 26 من Android Support Library طلب الخطوط من أحد تطبيقات مقدِّم الخدمة بدلاً من تجميع الخطوط في حزمة 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، راجع تغيير حجم النص تلقائيًا.
الرموز التكيُّفية
يقدّم 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 لإتاحة شاشات عرض متعددة.
يمكن الآن استخدام الأمر shell start
لبدء نشاط ما ولتحديد العرض المستهدَف للنشاط:
adb shell start <activity_name> --display <display_id>
هوامش تنسيق موحّد والمساحة المتروكة
يسهّل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تحديد الحالات التي تستخدم فيها الجوانب المعاكسة لعنصر View
نفس الهامش أو المساحة المتروكة.
يمكنك الآن على وجه التحديد استخدام السمات التالية في ملفات XML
للتنسيق:
-
layout_marginVertical
، الذي يحدّدlayout_marginTop
وlayout_marginBottom
في الوقت نفسه. -
layout_marginHorizontal
، الذي يحدّدlayout_marginLeft
وlayout_marginRight
في الوقت نفسه. -
paddingVertical
، الذي يحدّدpaddingTop
وpaddingBottom
في الوقت نفسه. -
paddingHorizontal
، الذي يحدّدpaddingLeft
وpaddingRight
في الوقت نفسه.
ملاحظة: إذا خصَّصت منطق تطبيقك
لدعم اللغات والثقافات المختلفة، بما في ذلك اتجاه النص، يُرجى العِلم أنّ هذه
السمات لا تؤثر في قيم
layout_marginStart
أو
layout_marginEnd
أو
paddingStart
أو
paddingEnd
. يمكنك تعيين هذه القيم بنفسك، بالإضافة إلى سمات
التخطيط العمودي والأفقي الجديدة، لإنشاء سلوك تخطيط يعتمد على اتجاه النص.
التقاط المؤشر
تستفيد بعض التطبيقات، مثل الألعاب وسطح المكتب البعيد وبرامج المحاكاة الافتراضية، كثيرًا من التحكّم في مؤشر الماوس. ميزة "الالتقاط بالمؤشر" هي ميزة جديدة في Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تتيح إمكانية التحكّم من خلال عرض جميع أحداث الماوس في وضع مركّز في تطبيقك.
بدءًا من نظام التشغيل Android 8.0، يمكن لتطبيق 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
تتيح الآن وضع التقديم/الترجيع والتشغيل بالعكس. يتيح لك البحث تعيين موضع الرسوم المتحركة المعينة على نقطة زمنية معينة. ويكون التشغيل العكسي مفيدًا إذا كان تطبيقك يحتوي على
رسوم متحركة لإجراءات يمكن التراجع عنها. بدلاً من تحديد مجموعتين منفصلتين من الرسوم المتحركة،
يمكنك تشغيل نفس المجموعة بالعكس.
الإدخال والتنقل
مجموعات التنقّل باستخدام لوحة المفاتيح
إذا كان نشاط في تطبيقك يستخدم تسلسلاً هرميًا معقدًا للعرض، مثل ذلك الموجود في الشكل 2، ففكر في تنظيم مجموعات من عناصر واجهة المستخدم في مجموعات لتسهيل التنقل باستخدام لوحة المفاتيح فيما بينها. ويمكن للمستخدمين الضغط على Meta+Tab أو البحث + Tab على أجهزة Chromebook للانتقال من مجموعة إلى أخرى. ومن الأمثلة الجيدة على المجموعات ما يلي: اللوحات الجانبية وأشرطة التنقل ومناطق المحتوى الرئيسية والعناصر التي يمكن أن تحتوي على العديد من العناصر الفرعية.
![مثال على نشاط يتضمّن خمس مجموعات تنقُّل يمكن للمستخدم التنقّل فيها باستخدام اختصار مجموعة التنقّل بلوحة المفاتيح تظهر المجموعات بالترتيب التالي: اللوحة العلوية واللوحة الجانبية اليمنى ومنطقة المحتوى الرئيسية واللوحة السفلية وزر الإجراء الرئيسي.](https://developer.android.google.cn/static/images/about/versions/oreo/keyboard-navigation-clusters.png?authuser=8&hl=ar)
لتحويل العنصر 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
.
النظام
أدوات الرصد الجديدة للوضع StrictMode
يضيف نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ثلاث أدوات رصد جديدة لوضع ExactMode للمساعدة في تحديد الأخطاء المحتملة في تطبيقك:
- سيرصد
detectUnbufferedIo()
متى يقرأ تطبيقك البيانات أو يكتبها بدون تخزين مؤقت، ما قد يؤثر بشكل كبير في الأداء. - سيرصد "
detectContentUriWithoutPermission()
" الحالات التي ينسى فيها تطبيقك عن طريق الخطأ منح الأذونات لتطبيق آخر عند بدء نشاط خارج التطبيق. - سيرصد
detectUntaggedSockets()
الحالات التي ينفّذ فيها تطبيقك حركة بيانات الشبكة بدون استخدامsetThreadStatsTag(int)
للإشارة إلى الزيارات لأغراض تصحيح الأخطاء.
البيانات المؤقتة
يقدّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) إرشادات وسلوكيات أفضل بشأن البيانات المخزَّنة مؤقتًا. يتم الآن منح
كل تطبيق حصة من مساحة القرص لتخزين البيانات المخزَّنة مؤقتًا، كما هو موضّح في
getCacheQuotaBytes(UUID)
.
عندما يحتاج النظام إلى إخلاء مساحة على القرص، سيبدأ بحذف الملفات المخزنة مؤقتًا من التطبيقات التي تجاوزت الحصة المخصصة لها. وبالتالي، إذا احتفظت ببياناتك المخزنة مؤقتًا ضمن الحصة المخصصة، ستكون ملفاتك المخزنة مؤقتًا من بين الملفات الأخيرة التي يتم محوها على النظام عند الضرورة. عندما يحدد النظام الملفات المخزنة مؤقتًا التي سيتم حذفها داخل تطبيقك، سيراعي الملفات الأقدم أولاً (كما هو محدد حسب الوقت المعدّل).
هناك أيضًا سلوكان جديدان يمكنك تفعيلهما على أساس كل دليل للتحكّم في كيفية إخلاء النظام من البيانات المخزّنة مؤقتًا:
- يمكن استخدام
StorageManager.setCacheBehaviorAtomic()
للإشارة إلى أنه يجب حذف الدليل وكل محتواه كوحدة صغيرة واحدة. - يمكن استخدام
setCacheBehaviorTombstone(File, boolean)
للإشارة إلى أنّه بدلاً من حذف الملفات داخل الدليل، يجب اقتطاعها ليكون طولها 0 بايت، مع ترك الملف الفارغ بدون تغيير.
وأخيرًا، عندما تحتاج إلى تخصيص مساحة على القرص للملفات الكبيرة، ننصحك باستخدام واجهة برمجة التطبيقات allocateBytes(FileDescriptor, long)
الجديدة التي ستمحو تلقائيًا الملفات المخزّنة مؤقتًا التي تنتمي إلى تطبيقات أخرى (حسب الحاجة) لتلبية طلبك. عند تحديد ما إذا كان
الجهاز يتضمّن مساحة كافية على القرص للاحتفاظ بالبيانات الجديدة، اتصِل بـ
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()
لفئات الوسائط التالية:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.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);
- بإمكان "
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
يتوافق الإصدار 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)
- دمج برنامج ترميز LDAC من Sony في حزمة البلوتوث
إقران الجهاز المصاحب
يوفّر Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) واجهات برمجة تطبيقات تتيح لك تخصيص مربع حوار طلب الإقران عند محاولة الإقران مع الأجهزة المصاحبة عبر البلوتوث وتقنية BLE وWi-Fi. لمزيد من المعلومات، يُرجى الاطّلاع على إقران الجهاز المصاحب.
لمزيد من المعلومات حول استخدام البلوتوث على نظام التشغيل Android، يمكنك الاطّلاع على دليل البلوتوث. لمعرفة التغييرات في البلوتوث الخاصة بنظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يمكنك الاطّلاع على قسم البلوتوث في صفحة التغييرات في سلوك الإصدار 8.0 من نظام التشغيل Android.
المشاركة
المشاركة الذكية
يتعرّف Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) على خيارات المشاركة المفضّلة لدى المستخدمين ويفهم بشكل أفضل كل نوع من أنواع المحتوى المتوافقة مع التطبيقات المناسبة للمشاركة معه. على سبيل المثال، إذا التقط المستخدم صورة لإيصال، يمكن أن يقترح نظام Android 8.0 تطبيق لتتبُّع النفقات. وإذا التقط المستخدم صورة ذاتية، يمكن لتطبيق وسائل التواصل الاجتماعي التعامل مع الصورة بشكل أفضل. ويتعرّف Android 8.0 تلقائيًا على كل هذه الأنماط وفقًا للتفضيلات الشخصية للمستخدمين.
تعمل ميزة "المشاركة الذكية" مع أنواع من المحتوى غير image
، مثل
audio
وvideo
وtext
وURL
وغير ذلك.
لتفعيل ميزة "المشاركة الذكية"، أضِف إلى السمة ArrayList
تعليقات توضيحية تضم ما يصل إلى 3 سلاسل إلى الغرض الذي تشارك فيه المحتوى. يجب أن تصف التعليقات التوضيحية
المكونات أو الموضوعات الرئيسية في المحتوى. يوضّح مثال الرمز البرمجي التالي كيفية إضافة تعليقات توضيحية إلى الغرض:
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 ست طرق جديدة لمساعدة برامج المصادقة على إدارة التطبيقات التي يمكنها رؤية حساب:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: يضبط مستوى الرؤية لحساب مستخدم معين ومجموعة حزم.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: يحصل على مستوى الرؤية لحساب مستخدم معين ومجموعة حزم. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: تسمح برامج المصادقة بالحصول على الحسابات ومستويات الرؤية لحزمة معينة. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: يسمح هذا الخيار لجهات المصادقة بالحصول على قيم إذن الوصول المخزَّنة لحساب معيّن. -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: تسمح برامج المصادقة بتهيئة قيم مستوى الرؤية للحساب. -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
: لإضافة مستمعOnAccountsUpdateListener
إلى الكائنAccountManager
. يستدعي النظام هذا المستمع كلما تتغير قائمة الحسابات على الجهاز.
يقدّم Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) قيمتَين خاصتَين لاسم الحزمة لتحديد مستويات
مستوى الرؤية للتطبيقات التي لم يتم ضبطها باستخدام الطريقة
setAccountVisibility(android.accounts.Account, java.lang.String, int)
. يتم تطبيق
قيمة إذن الوصول PACKAGE_NAME_KEY_LEGACY_VISIBLE
على التطبيقات التي لديها
إذن GET_ACCOUNTS
وتستهدف إصدارات Android الأقدم من Android 8.0 أو التي تتطابق
توقيعاتها مع برنامج المصادقة الذي يستهدف أي إصدار من 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
للتعامل مع غرض معيّن تستدعيه فئة الاختبار.
عندما تستدعي فئة الاختبار الغرض، تعرض الطريقة كائن Instrumentation.ActivityResult
بدلاً من تنفيذ الغرض نفسه. باستخدام منطق الأهداف الوهمية هذا في اختباراتك، يمكنك التركيز على كيفية تجهيز نشاطك ومعالجته للغرض الذي تنتقل إليه إلى نشاط مختلف أو إلى تطبيق مختلف تمامًا.
وقت التشغيل والأدوات
تحسينات النظام الأساسي
يجلب Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) وقت التشغيل والتحسينات الأخرى إلى النظام الأساسي لتحقيق عدد من تحسينات الأداء. تتضمن هذه التحسينات جمع البيانات غير المرغوب فيها في الوقت نفسه، والاستخدام الأكثر كفاءة للذاكرة، والمنطقة المحلية للرمز.
تؤدي هذه التحسينات إلى زيادة مُدد التشغيل إلى جانب تحسين الأداء في كلّ من نظام التشغيل والتطبيقات.
تم تحديث التوافق مع لغة Java
يضيف نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) الدعم للعديد من واجهات برمجة تطبيقات OpenJDK Java الإضافية:
java.time
من OpenJDK 8.java.nio.file
وjava.lang.invoke
من OpenJDK 7.
لمعرفة المزيد حول الفئات والطرق ضمن هذه الحزم المضافة حديثًا، راجع الوثائق المرجعية لواجهة برمجة التطبيقات.
إذا أردت استخدام ميزات لغة Java 8 في "استوديو Android"، عليك تنزيل أحدث إصدار من المعاينة.
واجهات برمجة تطبيقات إطار عمل ICU4J Android المُحدَّثة
يعمل الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) على توسيع نطاق واجهات برمجة تطبيقات إطار عمل Android ICU4J، وهي مجموعة فرعية من واجهات برمجة تطبيقات ICU4J، ليستخدمها مطوِّرو التطبيقات ضمن حزمة android.icu
. وتستخدم واجهات برمجة التطبيقات هذه بيانات أقلمة متوفّرة على الجهاز، ما يتيح لك تقليل تأثير حزمة APK من خلال عدم تجميع مكتبات ICU4J في حزمة APK.
الجدول 1. إصدارات ICU وCLDR ويونيكود المستخدَمة في 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 للمؤسسات، يمكنك الاطّلاع على Android في Enterprise.