تغییرات رفتار: همه برنامه‌ها

پلاتفرم Android 12 شامل تغییرات رفتاری است که ممکن است برنامه شما را تحت‌تأثیر قرار دهد. تغییرات رفتاری زیر برای همه برنامه‌ها هنگام اجرا در Android 12، صرف‌نظر از targetSdkVersion، اعمال می‌شود. باید برنامه‌تان را آزمایش کنید و سپس درصورت لزوم آن را اصلاح کنید تا به‌درستی از این موارد پشتیبانی کند.

حتماً فهرست تغییرات رفتاری را که فقط بر برنامه‌هایی که Android 12 را هدف قرار می‌دهند تأثیر می‌گذارد نیز مرور کنید.

تجربه کاربری

جلوه پیمایش بیش‌ازحد کششی

در دستگاه‌های دارای Android نسخه ۱۲ و بالاتر، رفتار بصری برای رویدادهای پیمایش بیش‌ازحد تغییر می‌کند.

در Android نسخه ۱۱ و پایین‌تر، رویداد فراتر از پیمایش باعث می‌شود عناصر دیداری درخشش داشته باشند؛ در Android نسخه ۱۲ و بالاتر، عناصر دیداری در رویداد کشیدن کشیده می‌شوند و به عقب برمی‌گردند و در رویداد پرتاب کردن، پرتاب می‌شوند و به عقب برمی‌گردند.

برای اطلاعات بیشتر، راهنمای پویانمایی اشاره‌های پیمایش را ببینید.

صفحه اسپلش برنامه

اگر قبلاً صفحه اسپلش سفارشی را در Android نسخه ۱۱ یا پایین‌تر پیاده‌سازی کرده‌اید، باید برنامه‌تان را به SplashScreen API منتقل کنید تا مطمئن شوید که از Android نسخه ۱۲ به‌درستی نمایش داده می‌شود. اگر برنامه‌تان را منتقل نکنید، تجربه راه‌اندازی برنامه تنزل خواهد کرد یا ناخواسته خواهد بود.

برای دستورالعمل‌ها، به انتقال پیاده‌سازی صفحه اسپلش موجود به Android 12 مراجعه کنید.

علاوه‌براین، از Android 12، سیستم همیشه صفحه اسپلش پیش‌فرض سیستم Android جدید را در راه‌اندازی سرد و راه‌اندازی گرم برای همه برنامه‌ها اعمال می‌کند. به‌طور پیش‌فرض، این صفحه اسپلش پیش‌فرض سیستم بااستفاده از عنصر نماد راه‌انداز برنامه شما و windowBackground زمینه شما (اگر تک‌رنگ باشد) ساخته می‌شود.

برای جزئیات بیشتر، راهنمای توسعه‌دهندگان صفحه اسپلش را ببینید.

وضوح قصد وب

از Android نسخه ۱۲ (سطح میانای برنامه‌سازی کاربردی ۳۱)، هدف وب عمومی فقط درصورتی به فعالیتی در برنامه شما تبدیل می‌شود که برنامه شما برای دامنه خاص موجود در آن هدف وب تأیید شده باشد. اگر برنامه شما برای دامنه تأیید نشده باشد، قصد وب به‌جای آن به برنامه مرورگر پیش‌فرض کاربر ارجاع داده می‌شود.

برنامه‌ها می‌توانند این تأیید را با انجام یکی از کارهای زیر دریافت کنند:

اگر برنامه‌تان هدف‌های وب را فراخوانی می‌کند، افزودن پیام‌واره یا کادر گفتگویی را درنظر بگیرید که از کاربر می‌خواهد کنش را تأیید کند.

بهبود حالت فراگیر برای پیمایش اشاره‌ای

Android 12 رفتار موجود را یکپارچه می‌کند تا کاربران راحت‌تر بتوانند فرمان‌های پیمایش اشاره‌ای را در حالت فراگیر اجرا کنند. علاوه‌براین، Android 12 رفتار سازگاری با نسخه قدیمی را برای حالت فراگیر چسبان ارائه می‌دهد.

Display#getRealSize و getRealMetrics: منسوخ شدن و محدودیت‌ها

دستگاه‌های Android در ضریب‌های شکل مختلفی دردسترس هستند، مثل صفحه‌نمایش‌های بزرگ، رایانه‌های لوحی، و دستگاه‌های تاشو. برای ارائه محتوای مناسب برای هر دستگاه، برنامه‌تان باید اندازه صفحه‌نمایش یا نمایشگر را تعیین کند. با گذشت زمان، Android میاناهای برنامه‌سازی کاربردی مختلفی برای بازیابی این اطلاعات ارائه کرده است. در Android 11، میانای برنامه‌سازی کاربردی WindowMetrics را معرفی کردیم و این روش‌ها را منسوخ کردیم:

در Android 12 همچنان توصیه می‌کنیم از WindowMetrics استفاده کنید و این روش‌ها را منسوخ می‌کنیم:

برای کاهش رفتار برنامه‌هایی که از Display API برای بازیابی محدوده‌های برنامه استفاده می‌کنند، Android 12 مقادیر برگردانده‌شده توسط API را برای برنامه‌هایی که کاملاً قابل‌تغییر اندازه نیستند محدود می‌کند. این امر می‌تواند بر برنامه‌هایی که از این اطلاعات با MediaProjection استفاده می‌کنند تأثیر بگذارد.

برنامه‌ها باید از میاناهای برنامه‌سازی کاربردی WindowMetrics برای پرسمان کردن حدود پنجره‌شان، و از Configuration.densityDpi برای پرسمان کردن تراکم فعلی استفاده کنند.

برای سازگاری گسترده‌تر با نسخه‌های قدیمی‌تر Android، می‌توانید از کتابخانه Jetpack WindowManager استفاده کنید که شامل کلاس WindowMetrics است که از Android 4.0 (سطح API‏ ۱۴) و بالاتر پشتیبانی می‌کند.

نمونه‌هایی از نحوه استفاده از WindowMetrics

ابتدا مطمئن شوید که فعالیت‌های برنامه‌تان کاملاً قابل‌تغییر اندازه باشند.

فعالیت باید برای هر کار مرتبط با واسط کاربر، به‌ویژه WindowManager.getCurrentWindowMetrics() یا WindowMetricsCalculator.computeCurrentWindowMetrics() Jetpack، به WindowMetrics از بافت فعالیت متکی باشد.

اگر برنامه‌تان MediaProjection ایجاد می‌کند، مرزها باید اندازه درستی داشته باشند زیرا طرح‌افکنی بخش نمایشی را که برنامه طرح‌افکن در آن اجرا می‌شود ضبط می‌کند.

اگر اندازه برنامه کاملاً قابل‌تغییر باشد، بافت فعالیت حدود صحیح را برمی‌گرداند به‌این‌صورت:

کاتلین

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

جاوا

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

اگر برنامه کاملاً قابل‌تغییر اندازه نباشد، باید از یک نمونه WindowContext پرس‌وجو کند و WindowMetrics مرزهای فعالیت را بااستفاده از WindowManager.getMaximumWindowMetrics() یا روش Jetpack WindowMetricsCalculator.computeMaximumWindowMetrics() بازیابی کند.

کاتلین

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

جاوا

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

همه برنامه‌ها در حالت چندپنجره‌ای

Android 12 حالت چندپنجره‌ای را به رفتار استاندارد تبدیل می‌کند.

در صفحه‌نمایش‌های بزرگ (sw >= 600dp)، پلاتفرم از همه برنامه‌ها در حالت چندپنجره‌ای صرف‌نظر از پیکربندی برنامه پشتیبانی می‌کند. اگر resizeableActivity="false"، برنامه درصورت لزوم در حالت سازگاری قرار می‌گیرد تا با ابعاد نمایشگر مطابقت داشته باشد.

در صفحه‌نمایش‌های کوچک (sw < 600dp)، سیستم minWidth و minHeight فعالیت را بررسی می‌کند تا تعیین کند آیا فعالیت می‌تواند در حالت چندپنجره‌ای اجرا شود یا نه. اگر resizeableActivity="false"، برنامه بدون توجه به حداقل عرض و ارتفاع از اجرا در حالت چندپنجره‌ای منع می‌شود.

برای اطلاعات بیشتر، به پشتیبانی از حالت چندپنجره‌ای مراجعه کنید.

پیش‌نمای دوربین در صفحه‌نمایش‌های بزرگ

برنامه‌های دوربین معمولاً رابطه ثابتی بین جهت دستگاه و نسبت ابعادی پیش‌نمایش دوربین فرض می‌کنند. اما ابعاد صفحه‌نمایش بزرگ، مانند دستگاه‌های تاشو، و حالت‌های نمایش مانند چندپنجره‌ای و چندنمایشگری، این فرض را به چالش می‌کشند.

در Android 12، برنامه‌های دوربینی که جهت صفحه خاصی را درخواست می‌کنند و تغییرپذیر نیستند (resizeableActivity="false") به‌طور خودکار وارد حالت عمودی درج‌شده می‌شوند که جهت و نسبت ابعادی مناسب پیش‌نمایش دوربین را تضمین می‌کند. در دستگاه‌های تاشو و سایر دستگاه‌هایی که لایه انتزاعی سخت‌افزار دوربین (HAL) دارند، چرخش اضافی روی خروجی دوربین اعمال می‌شود تا جهت حسگر دوربین را جبران کند، و خروجی دوربین برش داده می‌شود تا با نسبت ابعادی پیش‌نمایش دوربین برنامه مطابقت داشته باشد. برش و چرخش اضافی باعث می‌شود پیش‌نمایش دوربین صرف‌نظر از جهت دستگاه و حالت تاشده یا بازشده دستگاه به‌درستی ارائه شود.

تأخیر تجربه کاربری برای اعلان‌های سرویس پیش‌زمینه‌ای

برای ارائه تجربه‌ای ساده برای سرویس‌های پیش‌زمینه‌ای کوتاه‌مدت، دستگاه‌هایی که Android 12 یا بالاتر را اجرا می‌کنند می‌توانند نمایش اعلان‌های سرویس پیش‌زمینه‌ای را با چند استثنا به‌مدت ۱۰ ثانیه به‌تأخیر بیندازند. این تغییر به تکالیف کوتاه‌مدت فرصت می‌دهد تا قبل‌از ظاهر شدن اعلان‌هایشان تکمیل شوند.

عملکرد

سطل حالت آماده‌به‌کار برنامه محدودشده

‫Android نسخه ۱۱ (سطح میانای برنامه‌سازی کاربردی ۳۰) محدوده محدودشده را به‌عنوان «محدوده آماده‌به‌کار برنامه» معرفی کرد. از Android 12، این دسته به‌طور پیش‌فرض فعال است. سطل محدودشده کمترین اولویت (و بیشترین محدودیت‌ها) را در بین همه سطل‌ها دارد. دسته‌ها به‌ترتیب اولویت از زیاد به کم عبارت‌اند از:

  1. فعال: برنامه درحال‌حاضر درحال استفاده است یا اخیراً استفاده شده است.
  2. مجموعه کاری: برنامه به‌طور منظم استفاده می‌شود.
  3. مکرر: برنامه اغلب استفاده می‌شود، اما نه هر روز.
  4. نادر: برنامه به‌ندرت استفاده می‌شود.
  5. محدودشده: برنامه مقدار زیادی از منابع سیستم را مصرف می‌کند یا ممکن است رفتار نامطلوبی نشان دهد.

سیستم علاوه‌بر الگوهای استفاده، رفتار برنامه‌تان را نیز درنظر می‌گیرد تا تصمیم بگیرد برنامه‌تان را در باکت محدودشده قرار دهد یا نه.

اگر برنامه‌تان از منابع سیستم به‌طور مسئولانه‌تری استفاده کند، احتمال اینکه در دسته محدودشده قرار بگیرد کمتر است. همچنین، اگر کاربر مستقیماً با برنامه شما تعامل داشته باشد، سیستم برنامه شما را در دسته محدودکننده کمتری قرار می‌دهد.

بررسی کنید برنامه‌تان در دسته محدودشده قرار دارد یا نه

برای بررسی اینکه آیا سیستم برنامه‌تان را در دسته محدودشده قرار داده است یا نه، getAppStandbyBucket() را فراخوانی کنید. اگر مقدار برگشتی این روش STANDBY_BUCKET_RESTRICTED باشد، برنامه‌تان در دسته محدودشده قرار دارد.

آزمایش کردن رفتار سطل محدودشده

برای آزمایش رفتار برنامه‌تان وقتی سیستم آن را در دسته محدودشده قرار می‌دهد، می‌توانید به‌صورت دستی برنامه‌تان را به آن دسته منتقل کنید. برای انجام این کار، فرمان زیر را در پنجره ترمینال اجرا کنید:

adb shell am set-standby-bucket PACKAGE_NAME restricted

مکان پیش‌زمینه و «بهینه‌سازی باتری»

از Android 12 به بعد، مکان پیش‌زمینه‌ای (ازجمله از سرویس پیش‌زمینه‌ای) می‌تواند همچنان درحین فعال بودن «بهینه‌سازی باتری» ارائه شود، حتی وقتی صفحه‌نمایش خاموش است.

قبلاً، وقتی صفحه‌نمایش خاموش بود، حالت «بهینه‌سازی باتری» به‌روزرسانی‌های مکان را متوقف می‌کرد. این تغییر باعث بهبود عمر باتری برای کاربران می‌شود و به این معنی است که توسعه‌دهندگان می‌توانند از کاربران نخواهند که برای اطمینان از دریافت مکان، «بهینه‌سازی باتری» را غیرفعال کنند.

برنامه‌هایی که ازطریق سرویس پیش‌زمینه‌ای درخواست مکان می‌کنند باید مراحل زیر را دنبال کنند:

  1. برای بررسی نحوه عملکرد ویژگی‌های مکان دستگاه در زمانی که «بهینه‌سازی باتری» فعال است، getLocationPowerSaverMode() را فراخوانی کنید.
  2. اگر این مقدار LOCATION_MODE_FOREGROUND_ONLY را برگرداند، برنامه شما همچنان به‌روزرسانی‌های مکان را درحالی‌که در پیش‌زمینه است یا سرویس پیش‌زمینه‌ای را اجرا می‌کند دریافت خواهد کرد، حتی اگر «بهینه‌سازی باتری» روشن و صفحه‌نمایش خاموش باشد.

امنیت و حریم خصوصی

مکان تقریبی

کادر گفتگو دو مجموعه گزینه دارد، یکی بالای دیگری
شکل ۱. کادر گفتگوی اجازه‌های سیستم که به کاربر امکان می‌دهد اطلاعات مکان تقریبی را اعطا کند.

در دستگاه‌هایی که Android نسخه ۱۲ یا بالاتر دارند، کاربران می‌توانند درخواست کنند که برنامه شما فقط به اطلاعات مکان تقریبی دسترسی داشته باشد.

اگر برنامه‌تان اجازه زمان اجرای ACCESS_FINE_LOCATION را درخواست می‌کند، باید اجازه ACCESS_COARSE_LOCATION را نیز درخواست کنید تا درصورتی‌که کاربر دسترسی به مکان تقریبی را به برنامه‌تان اعطا کرد، بتوانید آن را مدیریت کنید. باید هر دو اجازه را در یک درخواست زمان اجرا قرار دهید.

کادر گفتگوی اجازه‌های سیستم شامل گزینه‌های زیر برای کاربر است، همان‌طور که در شکل ۱ نشان داده شده است:

  • دقیق: دسترسی به اطلاعات دقیق مکان را فراهم می‌کند.
  • تقریبی: فقط به اطلاعات مکان تقریبی دسترسی می‌دهد.

کلیدهای تغییر وضعیت میکروفون و دوربین

دستگاه‌های پشتیبانی‌شده‌ای که Android نسخه ۱۲ یا بالاتر دارند به کاربران اجازه می‌دهند با فشار دادن یک گزینه روشن/ خاموش، دسترسی به دوربین و میکروفون را برای همه برنامه‌های دستگاه فعال و غیرفعال کنند. کاربران می‌توانند ازطریق تنظیمات فوری، همان‌طور که در شکل ۱ نشان داده شده است، یا ازطریق صفحه «حریم خصوصی» در تنظیمات سیستم به گزینه‌های قابل‌تغییر دسترسی پیدا کنند.

درباره این کلیدهای روشن/خاموش و نحوه بررسی اینکه برنامه‌تان از روال‌های مطلوب مربوط به اجازه‌های CAMERA و RECORD_AUDIO پیروی می‌کند یا نه بیشتر بدانید.

نشانگرهای میکروفون و دوربین

در دستگاه‌های دارای Android نسخه ۱۲ یا بالاتر، وقتی برنامه‌ای به میکروفون یا دوربین دسترسی پیدا می‌کند، نمادی در نوار وضعیت نشان داده می‌شود.

درباره این نشانگرها و نحوه بررسی اینکه برنامه‌تان از روال‌های مطلوب مربوط به اجازه‌های CAMERA و RECORD_AUDIO پیروی می‌کند بیشتر بدانید.

کاشی‌های تنظیمات فوری با برچسب «دسترسی به دوربین» و
         «دسترسی به میکروفون» مشخص شده‌اند
شکل ۲. کلیدهای میکروفون و دوربین در «تنظیمات فوری».
مستطیلی با گوشه‌های گرد در گوشه بالا سمت چپ که
         شامل نماد دوربین و نماد میکروفون است
شکل ۳. نشانگرهای میکروفون و دوربین که دسترسی اخیر به داده‌ها را نشان می‌دهند.

رؤیت‌پذیری بسته اجازه

در دستگاه‌هایی که Android نسخه ۱۲ یا بالاتر دارند، برنامه‌هایی که Android نسخه ۱۱ (سطح میانای برنامه‌سازی کاربردی ۳۰) یا بالاتر را هدف قرار می‌دهند و یکی از روش‌های زیر را فراخوانی می‌کنند، براساس نمایان بودن بسته برنامه در برنامه‌های دیگر، مجموعه نتایج فیلترشده‌ای دریافت می‌کنند:

پیاده‌سازی BouncyCastle برداشته شد

Android 12 بسیاری از پیاده‌سازی‌های BouncyCastle از الگوریتم‌های رمزنگاری را که قبلاً منسوخ شده بودند، ازجمله همه الگوریتم‌های AES، حذف می‌کند. درعوض، سیستم از پیاده‌سازی‌های Conscrypt این الگوریتم‌ها استفاده می‌کند.

اگر هریک از موارد زیر درست باشد، این تغییر بر برنامه‌تان تأثیر می‌گذارد:

  • برنامه شما از کلیدهای ۵۱۲ بیتی استفاده می‌کند. Conscrypt از این اندازه کلید پشتیبانی نمی‌کند. درصورت لزوم، منطق رمزنگاری برنامه‌تان را به‌روز کنید تا از اندازه‌های کلید متفاوت استفاده کند.
  • برنامه شما از اندازه‌های کلید نامعتبر با KeyGenerator استفاده می‌کند. پیاده‌سازی Conscrypt از KeyGenerator درمقایسه با BouncyCastle، اعتبارسنجی بیشتری روی پارامترهای کلیدی انجام می‌دهد. برای مثال، Conscrypt به برنامه‌تان اجازه نمی‌دهد کلید AES‏ ۶۴ بیتی تولید کند، زیرا AES فقط از کلیدهای ۱۲۸، ۱۹۲، و ۲۵۶ بیتی پشتیبانی می‌کند.

    BouncyCastle اجازه می‌دهد کلیدهایی با اندازه نامعتبر تولید شود، اما بعداً اگر از این کلیدها با Cipher استفاده شود، ناموفق خواهد بود. Conscrypt زودتر ازکار می‌افتد.

  • رمزهای Galois/Counter Mode (GCM) را بااستفاده از اندازه‌ای غیراز ۱۲ بایت مقداردهی اولیه می‌کنید. پیاده‌سازی Conscrypt از GcmParameterSpec به مقداردهی اولیه ۱۲ بایت نیاز دارد که NIST آن را توصیه می‌کند.

اعلان‌های دسترسی به بریده‌دان

در Android نسخه ۱۲ و بالاتر، وقتی برنامه‌ای getPrimaryClip() را برای دسترسی به داده‌های کلیپ از برنامه دیگری برای اولین‌بار فراخوانی می‌کند، پیام بالاپر این دسترسی به بریده‌دان را به کاربر اطلاع می‌دهد.

نوشتار داخل پیام کادری حاوی قالب زیر است: APP pasted from your clipboard.

اطلاعات درباره نوشتار در شرح کلیپ

در Android 12 و بالاتر، getPrimaryClipDescription() می‌تواند جزئیات زیر را تشخیص دهد:

  • نوشتار سبک‌دار، بااستفاده از isStyledText().
  • طبقه‌بندی‌های مختلف نوشتار، مانند نشانی‌های وب، بااستفاده از getConfidenceScore().

برنامه‌ها نمی‌توانند کادرهای گفتگوی سیستم را ببندند

برای بهبود کنترل کاربر هنگام تعامل با برنامه‌ها و سیستم، کنش هدف ACTION_CLOSE_SYSTEM_DIALOGS از Android 12 منسوخ شده است. به‌جز چند مورد خاص، وقتی برنامه‌تان سعی می‌کند قصدی را فراخوانی کند که حاوی این کنش است، سیستم براساس نسخه کیت توسعه نرم‌افزار هدف برنامه‌تان یکی از کارهای زیر را انجام می‌دهد:

  • اگر برنامه شما Android نسخه ۱۲ یا بالاتر را هدف قرار دهد، SecurityException رخ می‌دهد.
  • اگر برنامه شما Android 11 (سطح میانای برنامه‌سازی کاربردی 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.
    

استثناها

در موارد زیر، برنامه همچنان می‌تواند کادرهای گفتگوی سیستم را در Android نسخه ۱۲ یا بالاتر ببندد:

  • برنامه شما درحال اجرای آزمون ابزارسنجی است.
  • برنامه شما Android نسخه ۱۱ یا پایین‌تر را هدف قرار می‌دهد و پنجره‌ای را نشان می‌دهد که بالای کشوی اعلان قرار دارد.

  • برنامه‌تان Android 11 یا پایین‌تر را هدف‌یابی می‌کند. علاوه‌براین، کاربر با اعلانی تعامل داشته است، احتمالاً بااستفاده از دکمه‌های کنش اعلان، و برنامه شما درحال پردازش سرویس یا گیرنده رویداد ثبت‌شده در پاسخ به آن کنش کاربر است.

  • برنامه شما Android 11 یا پایین‌تر را هدف قرار می‌دهد و سرویس دسترس‌پذیری فعال دارد. اگر برنامه شما Android 12 را هدف قرار می‌دهد و می‌خواهد نوار اعلان را ببندد، به‌جای آن از کنش دسترس‌پذیری 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، این حداکثر کدری به‌طور پیش‌فرض ۰٫۸ است.

تشخیص دادن مسدود شدن لمس غیرقابل‌اعتماد

اگر کنش لمسی توسط سیستم مسدود شود، Logcat پیام زیر را ثبت می‌کند:

Untrusted touch due to occlusion by PACKAGE_NAME

آزمایش کردن تغییر

لمس‌های غیرقابل‌اعتماد به‌طور پیش‌فرض در دستگاه‌های دارای Android نسخه ۱۲ یا بالاتر مسدود می‌شوند. برای مجاز کردن لمس‌های غیرقابل‌اعتماد، فرمان 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() فعالیت و تکلیف آن را درصورت لزوم به پس‌زمینه منتقل می‌کند و تجربه پیمایش یکپارچه‌تری را برای کاربران در سراسر برنامه‌ها فراهم می‌کند.

همچنین توجه داشته باشید که به‌طور کلی توصیه می‌کنیم برای ارائه پیمایش به عقب سفارشی، به‌جای لغو کردن onBackPressed()، از میاناهای برنامه‌سازی کاربردی AndroidX Activity استفاده کنید. اگر مؤلفه‌ای برای رهگیری فشار دادن دکمه «برگشت» سیستم وجود نداشته باشد، میاناهای برنامه‌سازی کاربردی AndroidX Activity به‌طور خودکار به رفتار مناسب سیستم واگذار می‌کنند.

گرافیک و تصویر

تعویض نرخ بازآوری بهبودیافته است

در Android 12، تغییرات نرخ بازآوری بااستفاده از setFrameRate() می‌تواند بدون توجه به اینکه نمایشگر از انتقال یکپارچه به نرخ بازآوری جدید پشتیبانی می‌کند یا نه اتفاق بیفتد؛ انتقال یکپارچه انتقالی است که هیچ‌گونه وقفه دیداری ندارد، مثل سیاه شدن صفحه‌نمایش برای یک یا دو ثانیه. قبلاً، اگر نمایشگر از انتقال یکپارچه پشتیبانی نمی‌کرد، معمولاً پس‌از فراخوانی setFrameRate() به استفاده از همان نرخ بازآوری ادامه می‌داد. با فراخوانی getAlternativeRefreshRates() می‌توانید ازقبل تعیین کنید که آیا انتقال به نرخ بازآوری جدید احتمالاً یکپارچه خواهد بود یا نه. به‌طور کلی، فراخوانی برگشتی onDisplayChanged() پس‌از تکمیل شدن تغییر نرخ بازآوری فراخوانی می‌شود، اما برای برخی‌از نمایشگرهای متصل‌شده خارجی، درطول گذار غیریکپارچه فراخوانی می‌شود.

در اینجا مثالی از نحوه پیاده‌سازی این مورد آورده شده است:

کاتلین

// 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)

جاوا

// 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 را توصیف می‌کنند که در مشخصات Passpoint Wi-Fi Alliance تعریف شده است.

برای اطلاعات بیشتر، میانای برنامه‌سازی کاربردی پیشنهاد Wi-Fi برای اتصال اینترنت را ببینید.

محدودیت‌های میانای غیرکیت توسعه نرم‌افزار به‌روز شد

‫Android 12 شامل فهرست‌های به‌روزشده‌ای از میاناهای غیرکیت توسعه نرم‌افزار محدودشده است که براساس همکاری با توسعه‌دهندگان Android و جدیدترین آزمایش‌های داخلی تهیه شده است. هرزمان ممکن باشد، پیش‌از محدود کردن میاناهای غیرکیت توسعه نرم‌افزار، مطمئن می‌شویم که جایگزین‌های عمومی دردسترس باشند.

اگر برنامه شما Android 12 را هدف قرار نمی‌دهد، برخی‌از این تغییرات ممکن است فوراً بر شما تأثیر نگذارد. بااین‌حال، اگرچه درحال‌حاضر می‌توانید از برخی میاناهای غیرکیت توسعه نرم‌افزار استفاده کنید (بسته به سطح میانای برنامه‌سازی کاربردی هدف برنامه‌تان)، استفاده از هر روش یا فیلد غیرکیت توسعه نرم‌افزار همیشه خطر بالایی برای ازکار افتادن برنامه‌تان دارد.

اگر مطمئن نیستید که برنامه‌تان از میاناهای غیرکیت توسعه نرم‌افزار استفاده می‌کند یا نه، می‌توانید برنامه‌تان را آزمایش کنید تا متوجه شوید. اگر برنامه‌تان به میاناهای غیر SDK متکی است، باید برنامه‌ریزی برای انتقال به جایگزین‌های SDK را شروع کنید. بااین‌حال، می‌دانیم که برخی‌از برنامه‌ها موارد استفاده معتبری برای استفاده از میاناهای غیرکیت توسعه نرم‌افزار دارند. اگر نمی‌توانید جایگزینی برای استفاده از میانای غیرکیت توسعه نرم‌افزار برای ویژگی‌ای در برنامه‌تان پیدا کنید، باید درخواست میانای برنامه‌سازی کاربردی عمومی جدیدی بدهید.

برای آشنایی بیشتر با تغییرات این نسخه از Android، به به‌روزرسانی‌های محدودیت‌های میانای غیر کیت توسعه نرم‌افزار در Android 12 مراجعه کنید. برای کسب اطلاعات بیشتر درباره میاناهای غیرکیت توسعه نرم‌افزار به‌طور کلی، به محدودیت‌های میاناهای غیرکیت توسعه نرم‌افزار مراجعه کنید.