تغييرات السلوك: جميع التطبيقات

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

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

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

تأثير تجاوز حد التمرير

على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android والإصدارات الأحدث، يتغيّر السلوك المرئي لأحداث التمرير السريع إلى ما بعد نهاية المحتوى.

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

لمزيد من المعلومات، يمكنك الاطّلاع على دليل تحريك إيماءات التمرير.

شاشات البداية للتطبيقات

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

للحصول على التعليمات، راجِع مقالة نقل عملية تنفيذ شاشة البداية الحالية إلى Android 12.

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

لمزيد من التفاصيل، يُرجى الاطّلاع على دليل المطوِّر الخاص بشاشات البداية.

حلّ الأهداف على الويب

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

يمكن للتطبيقات الحصول على هذه الموافقة من خلال تنفيذ أحد الإجراءات التالية:

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

تحسينات على الوضع الغامر للتنقّل بالإيماءات

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

‫Display#getRealSize وgetRealMetrics: الإيقاف النهائي والقيود

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

في نظام التشغيل Android 12، سنواصل اقتراح استخدام WindowMetrics، وسنتوقف عن استخدام الطرق التالية:

للحدّ من سلوك التطبيقات التي تستخدم واجهات برمجة التطبيقات الخاصة بالشاشات للحصول على حدود التطبيق، يفرض نظام التشغيل Android 12 قيودًا على القيم التي تعرضها واجهات برمجة التطبيقات للتطبيقات التي لا يمكن تغيير حجمها بالكامل. وقد يؤثر ذلك في التطبيقات التي تستخدم هذه المعلومات مع MediaProjection.

يجب أن تستخدم التطبيقات واجهات برمجة التطبيقات WindowMetrics للاستعلام عن حدود النافذة، وConfiguration.densityDpi للاستعلام عن الكثافة الحالية.

لتحقيق توافق أوسع مع الإصدارات القديمة من Android، يمكنك استخدام مكتبة Jetpack WindowManager التي تتضمّن فئة WindowMetrics تتوافق مع الإصدار 4.0 من نظام التشغيل Android (المستوى 14 من واجهة برمجة التطبيقات) والإصدارات الأحدث.

أمثلة على كيفية استخدام WindowMetrics

أولاً، تأكَّد من أنّ أنشطة تطبيقك قابلة لتغيير الحجم بالكامل.

يجب أن يعتمد النشاط على WindowMetrics من سياق النشاط لأي عمل متعلق بواجهة المستخدم، خاصةً WindowManager.getCurrentWindowMetrics() أو WindowMetricsCalculator.computeCurrentWindowMetrics() من Jetpack.

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

إذا كان التطبيق قابلاً لتغيير الحجم بالكامل، سيعرض سياق النشاط الحدود الصحيحة على النحو التالي:

Kotlin

val projectionMetrics: WindowMetrics = activityContext
      .getSystemService(WindowManager::class.java).maximumWindowMetrics

Java

WindowMetrics projectionMetrics = activityContext
      .getSystemService(WindowManager.class).getMaximumWindowMetrics();

إذا لم يكن التطبيق قابلاً لتغيير الحجم بالكامل، يجب أن يطلب بيانات من مثيل WindowContext ويسترد WindowMetrics لحدود النشاط باستخدام WindowManager.getMaximumWindowMetrics() أو طريقة Jetpack WindowMetricsCalculator.computeMaximumWindowMetrics().

Kotlin

val windowContext = context.createWindowContext(mContext.display!!,
      WindowManager.LayoutParams.TYPE_APPLICATION, null)
val projectionMetrics = windowContext.getSystemService(WindowManager::class.java)
      .maximumWindowMetrics

Java

Context windowContext = context.createWindowContext(mContext.getDisplay(),
      WindowManager.LayoutParams.TYPE_APPLICATION, null);
WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class)
      .getMaximumWindowMetrics();

جميع التطبيقات في وضع النوافذ المتعددة

يُعدّ وضع النوافذ المتعددة سلوكًا عاديًا في نظام التشغيل Android 12.

على الشاشات الكبيرة (عرض الشاشة >= 600 وحدة بكسل مستقلة الكثافة)، تتيح المنصة استخدام جميع التطبيقات في وضع النوافذ المتعددة بغض النظر عن إعدادات التطبيق. إذا كانت قيمة resizeableActivity="false"، سيتم وضع التطبيق في وضع التوافق عند الضرورة لاستيعاب أبعاد العرض.

على الشاشات الصغيرة (sw < 600dp)، يتحقّق النظام من minWidth وminHeight لأحد الأنشطة لتحديد ما إذا كان يمكن تشغيل النشاط في وضع النوافذ المتعددة. إذا كانت القيمة resizeableActivity="false"، سيتم منع التطبيق من التشغيل في وضع النوافذ المتعدّدة بغض النظر عن الحد الأدنى للعرض والارتفاع.

لمزيد من المعلومات، يُرجى الاطّلاع على التوافق مع النوافذ المتعددة.

معاينة الكاميرا على الشاشات الكبيرة

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

في نظام التشغيل Android 12، تنتقل تطبيقات الكاميرا التي تطلب اتجاهًا معيّنًا للشاشة ولا يمكن تغيير حجمها (resizeableActivity="false") تلقائيًا إلى وضع العرض العمودي المضمّن، ما يضمن الاتجاه ونسبة العرض إلى الارتفاع المناسبَين لمعاينة الكاميرا. على الأجهزة القابلة للطي والأجهزة الأخرى التي تتضمّن طبقة تجريد الأجهزة (HAL) للكاميرا، يتم تطبيق تدوير إضافي على ناتج الكاميرا للتعويض عن اتجاه مستشعر الكاميرا، ويتم اقتصاص ناتج الكاميرا ليتطابق مع نسبة العرض إلى الارتفاع لمعاينة الكاميرا في التطبيق. يضمن الاقتصاص والتدوير الإضافي عرضًا مناسبًا لمعاينة الكاميرا بغض النظر عن اتجاه الجهاز وحالته سواء كان مطويًا أو غير مطوي.

تأخير تجربة المستخدم لإشعارات الخدمات التي تعمل في المقدّمة

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

الأداء

حزمة التطبيقات المقيّدة في وضع الاستعداد

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

  1. نشط: يتم استخدام التطبيق حاليًا أو تم استخدامه مؤخرًا.
  2. مجموعة العمل: التطبيق قيد الاستخدام المنتظم.
  3. متكرّر: يتم استخدام التطبيق غالبًا، ولكن ليس كل يوم.
  4. نادر: التطبيق لا يُستخدم بشكل متكرّر.
  5. مقيَّد: يستهلك التطبيق قدرًا كبيرًا من موارد النظام، أو قد يسلك سلوكًا غير مرغوب فيه.

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

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

التحقّق ممّا إذا كان تطبيقك في مجموعة التطبيقات المحظورة

للتحقّق مما إذا كان النظام قد وضع تطبيقك في مجموعة التطبيقات التي تم تقييدها، استدعِ الدالة getAppStandbyBucket(). إذا كانت القيمة المعروضة لهذه الطريقة هي STANDBY_BUCKET_RESTRICTED، يعني ذلك أنّ تطبيقك مدرَج في المجموعة المحظورة.

اختبار سلوك الحزمة المحظورة

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

adb shell am set-standby-bucket PACKAGE_NAME restricted

الموقع الجغرافي في المقدّمة وميزة "توفير شحن البطارية"

بدءًا من الإصدار Android 12، يمكن مواصلة توفير الموقع الجغرافي في المقدّمة (بما في ذلك من خلال خدمة تعمل في المقدّمة) أثناء تفعيل &quot;وضع توفير البطارية&quot;، حتى عندما تكون الشاشة مطفأة.

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

يجب أن تتّخذ التطبيقات التي تطلب بيانات الموقع الجغرافي من خلال خدمة تعمل في المقدّمة الخطوات التالية:

  1. اتّصِل getLocationPowerSaverMode() للتحقّق من طريقة عمل ميزات تحديد الموقع الجغرافي للجهاز عندما تكون ميزة "توفير شحن البطارية" مفعَّلة.
  2. إذا تم عرض LOCATION_MODE_FOREGROUND_ONLY، سيستمر تطبيقك في تلقّي تحديثات الموقع الجغرافي أثناء تشغيله في المقدّمة أو أثناء تشغيل خدمة تعمل في المقدّمة عندما يكون "وضع توفير البطارية" مفعّلاً والشاشة مطفأة.

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

الموقع الجغرافي التقريبي

يحتوي مربّع الحوار على مجموعتَين من الخيارات، إحداهما فوق الأخرى
الشكل 1. مربّع حوار أذونات النظام الذي يتيح للمستخدم منح إذن الوصول إلى معلومات الموقع الجغرافي التقريبي

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

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

يتضمّن مربّع حوار أذونات النظام الخيارات التالية للمستخدم، كما هو موضّح في الشكل 1:

  • دقيق: يتيح الوصول إلى معلومات الموقع الجغرافي الدقيق.
  • الموقع الجغرافي التقريبي: يتيح هذا الخيار الوصول إلى معلومات الموقع الجغرافي التقريبي فقط.

خيارات إيقاف/تشغيل الميكروفون والكاميرا

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

يمكنك الاطّلاع على مزيد من المعلومات حول عناصر التحكّم هذه وكيفية التأكّد من أنّ تطبيقك يتّبع أفضل الممارسات المتعلّقة بأذونات CAMERA وRECORD_AUDIO.

مؤشرات استخدام الميكروفون والكاميرا

على الأجهزة التي تعمل بنظام التشغيل Android 12 أو إصدار أحدث، يظهر رمز في شريط الحالة عندما يصل أحد التطبيقات إلى الميكروفون أو الكاميرا.

يمكنك الاطّلاع على مزيد من المعلومات حول هذه المؤشرات وكيفية التأكّد من أنّ تطبيقك يتّبع أفضل الممارسات المتعلّقة بإذنَي CAMERA وRECORD_AUDIO.

يتم تصنيف مربّعات الإعدادات السريعة على أنّها &quot;إذن الوصول إلى الكاميرا&quot; و&quot;إذن الوصول إلى الميكروفون&quot;.
الشكل 2. أزرار تبديل تفعيل الميكروفون والكاميرا وإيقافهما في "الإعدادات السريعة"
مستطيل ذو زوايا مستديرة في أعلى يسار الشاشة يتضمّن رمز كاميرا ورمز ميكروفون
الشكل 3. مؤشرات استخدام الميكروفون والكاميرا، والتي تعرض عمليات الوصول الأخيرة إلى البيانات

إذن الوصول إلى حزمة التطبيق

على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، تتلقّى التطبيقات التي تستهدف الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث وتطلب إحدى الطرق التالية مجموعة نتائج تمت فلترتها استنادًا إلى إذن الوصول إلى الحِزمة الذي يمنحه التطبيق للتطبيقات الأخرى:

تمت إزالة تنفيذ BouncyCastle

يزيل نظام التشغيل Android 12 العديد من عمليات تنفيذ BouncyCastle لخوارزميات التشفير التي تم إيقافها نهائيًا سابقًا، بما في ذلك جميع خوارزميات AES. بدلاً من ذلك، يستخدم النظام عمليات تنفيذ Conscrypt لهذه الخوارزميات.

سيؤثّر هذا التغيير في تطبيقك في حال استيفاء أيٍّ من الشروط التالية:

  • يستخدم تطبيقك أحجام مفاتيح 512 بت. لا تتوافق مكتبة Conscrypt مع حجم المفتاح هذا. عدِّل منطق التشفير في تطبيقك لاستخدام أحجام مفاتيح مختلفة إذا لزم الأمر.
  • يستخدم تطبيقك أحجام مفاتيح غير صالحة مع KeyGenerator. تنفّذ مكتبة Conscrypt عملية تحقّق إضافية من صحة المَعلمات الرئيسية في KeyGenerator مقارنةً بمكتبة BouncyCastle. على سبيل المثال، لا تسمح مكتبة Conscrypt لتطبيقك بإنشاء مفتاح AES‏ 64 بت لأنّ AES لا يتيح سوى مفاتيح 128 بت و192 بت و256 بت.

    يسمح BouncyCastle بإنشاء مفاتيح بأحجام غير صالحة، ولكن يتعذّر لاحقًا إذا تم استخدام هذه المفاتيح مع Cipher. تتعذّر عملية Conscrypt في وقت مبكر.

  • تتم تهيئة رموز التشفير في وضع Galois/Counter Mode (GCM) باستخدام حجم آخر غير 12 بايت. يتطلّب تنفيذ GcmParameterSpec في Conscrypt عملية تهيئة بحجم 12 بايت، وهو ما توصي به هيئة NIST.

إشعارات الوصول إلى الحافظة

في نظام التشغيل Android 12 والإصدارات الأحدث، عندما يطلب تطبيق getPrimaryClip() الوصول إلى بيانات الحافظة من تطبيق آخر للمرة الأولى، يظهر إشعار مؤقت للمستخدم لإعلامه بهذا الوصول إلى الحافظة.

يحتوي النص داخل رسالة الإشعار المؤقت على التنسيق التالي: APP pasted from your clipboard.

معلومات حول النص في وصف المقطع

على أجهزة Android 12 والإصدارات الأحدث، يمكن لتطبيق getPrimaryClipDescription() رصد التفاصيل التالية:

لا يمكن للتطبيقات إغلاق مربّعات حوار النظام

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

  • إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، سيحدث SecurityException.
  • إذا كان تطبيقك يستهدف الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) أو إصدارًا أقدم، لن يتم تنفيذ الغرض، وستظهر الرسالة التالية في Logcat:

    E ActivityTaskManager Permission Denial: \
    android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \
    com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \
    dropping broadcast.
    

الاستثناءات

في الحالات التالية، يمكن للتطبيق إغلاق مربّعات حوار النظام على الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث:

  • يشغّل تطبيقك اختبارًا لأدوات القياس.
  • يستهدف تطبيقك الإصدار 11 من نظام التشغيل Android أو إصدارًا أقدم ويعرض نافذة في أعلى درج الإشعارات.

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

  • يستهدف تطبيقك الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم ويتضمّن خدمة تسهيل استخدام نشطة. إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android وأردت إغلاق شريط الإشعارات، استخدِم إجراء تسهيل الاستخدام GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADE بدلاً من ذلك.

يتم حظر أحداث اللمس غير الموثوق بها

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

التطبيقات المتأثِّرة

يؤثّر هذا التغيير في التطبيقات التي تتيح تمرير اللمسات عبر نوافذها، على سبيل المثال باستخدام العلامة FLAG_NOT_TOUCHABLE. تشمل الأمثلة على سبيل المثال لا الحصر ما يلي:

  • التراكبات التي تتطلّب إذن SYSTEM_ALERT_WINDOW، مثل النوافذ التي تستخدم TYPE_APPLICATION_OVERLAY، وتستخدم العلامة FLAG_NOT_TOUCHABLE
  • نوافذ الأنشطة التي تستخدم العلامة FLAG_NOT_TOUCHABLE

الاستثناءات

يُسمح بلمسات "التمرير" في الحالات التالية:

  • التفاعلات داخل تطبيقك: يعرض تطبيقك التراكب، ولا يظهر التراكب إلا عندما يتفاعل المستخدم مع تطبيقك.
  • النوافذ الموثوق بها وتشمل هذه النوافذ (على سبيل المثال لا الحصر) ما يلي:

  • النوافذ المخفية: يجب أن يكون العرض الأساسي للنافذة هو GONE أو INVISIBLE.

  • نوافذ شفافة تمامًا: قيمة السمة alpha هي 0.0 للنافذة.

  • نوافذ تنبيه النظام الشفافة بشكل كافٍ يعتبر النظام مجموعة من نوافذ تنبيهات النظام شفافة بشكل كافٍ عندما تكون درجة التعتيم المجمّعة أقل من أو تساوي الحد الأقصى لدرجة التعتيم التي يحجب بها النظام اللمسات. في نظام التشغيل Android 12، تبلغ درجة التعتيم القصوى هذه 0.8 تلقائيًا.

رصد حالات حظر اللمس غير الموثوق به

إذا حظر النظام إجراء لمس، سيسجِّل Logcat الرسالة التالية:

Untrusted touch due to occlusion by PACKAGE_NAME

اختبار التغيير

يتم تلقائيًا حظر اللمسات غير الموثوق بها على الأجهزة التي تعمل بنظام التشغيل Android 12 أو الإصدارات الأحدث. للسماح باللمسات غير الموثوق بها، نفِّذ أمر ADB التالي في نافذة طرفية:

# A specific app
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
# If you'd still like to see a Logcat message warning when a touch would be
# blocked, use 1 instead of 0.
adb shell settings put global block_untrusted_touches 0

لإعادة السلوك إلى الوضع التلقائي (حظر اللمسات غير الموثوق بها)، شغِّل الأمر التالي:

# A specific app
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
adb shell settings put global block_untrusted_touches 2

مراحل النشاط

لم يعُد يتم إنهاء أنشطة مشغّل التطبيقات الجذرية عند الضغط على الزر "رجوع"

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

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

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

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

الرسومات والصور

تحسين عملية التبديل بين معدّلات التحديث

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

في ما يلي مثال على كيفية تنفيذ ذلك:

Kotlin

// Determine whether the transition will be seamless.
// Non-seamless transitions may cause a 1-2 second black screen.
val refreshRates = this.display?.mode?.alternativeRefreshRates
val willBeSeamless = Arrays.asList<FloatArray>(refreshRates).contains(newRefreshRate)

// Set the frame rate even if the transition will not be seamless.
surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)

Java

// Determine whether the transition will be seamless.
// Non-seamless transitions may cause a 1-2 second black screen.
Display display = context.getDisplay(); // API 30+
Display.Mode mode = display.getMode();
float[] refreshRates = mode.getAlternativeRefreshRates();
boolean willBeSeamless = Arrays.asList(refreshRates).contains(newRefreshRate);

// Set the frame rate even if the transition will not be seamless.
surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS);

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

تعديلات على Passpoint

تمت إضافة واجهات برمجة التطبيقات التالية في نظام التشغيل Android 12:

  • isPasspointTermsAndConditionsSupported(): الأحكام والشروط هي إحدى ميزات Passpoint التي تتيح عمليات نشر الشبكات استبدال المداخل المشروطة الوصول إليها غير الآمنة، والتي تستخدم شبكات مفتوحة، بشبكة Passpoint آمنة. يتم عرض إشعار للمستخدم عندما يكون من المطلوب قبول الأحكام والشروط. يجب أن تطلب التطبيقات التي تقترح شبكات Passpoint محظورة بموجب البنود والشروط استخدام واجهة برمجة التطبيقات هذه أولاً للتأكّد من أنّ الجهاز يتيح هذه الإمكانية. إذا كان الجهاز لا يتوافق مع هذه الإمكانية، لن يتمكّن من الاتصال بهذه الشبكة، ويجب اقتراح شبكة بديلة أو شبكة قديمة.
  • isDecoratedIdentitySupported(): عند المصادقة على الشبكات التي تتضمّن بادئة مزخرفة، تتيح بادئة الهوية المزخرفة لمشغّلي الشبكات تعديل معرّف الوصول إلى الشبكة (NAI) لإجراء توجيه صريح من خلال خوادم وكيل متعددة داخل شبكة AAA (راجِع RFC 7542 لمزيد من المعلومات حول هذا الموضوع).

    يتضمّن نظام التشغيل Android 12 هذه الميزة ليتوافق مع مواصفات WBA الخاصة بإضافات PPS-MO. يجب أن تطلب التطبيقات التي تقترح شبكات Passpoint تتطلّب هوية مزخرفة واجهة برمجة التطبيقات هذه أولاً للتأكّد من أنّ الجهاز يتيح هذه الإمكانية. إذا كان الجهاز لا يتوافق مع هذه الإمكانية، لن يتم تزيين الهوية وقد يتعذّر إثبات صحة الشبكة.

لإنشاء اقتراح Passpoint، يجب أن تستخدم التطبيقات الفئات PasspointConfiguration وCredential وHomeSp. تصف هذه الفئات ملف تعريف Passpoint، الذي تم تحديده في مواصفات Wi-Fi Alliance Passpoint.

لمزيد من المعلومات، يُرجى الاطّلاع على واجهة برمجة التطبيقات لاقتراح شبكة Wi-Fi للاتصال بالإنترنت.

تعديل القيود المفروضة على الواجهات غير المتوفرة في حزمة SDK

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

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

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

لمزيد من المعلومات حول التغييرات في هذا الإصدار من Android، راجِع تعديلات على قيود الواجهات غير التابعة لحزمة SDK في Android 12. لمزيد من المعلومات حول الواجهات غير المتوفّرة في حزمة SDK بشكل عام، يمكنك الاطّلاع على القيود المفروضة على الواجهات غير المتوفّرة في حزمة SDK.