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

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

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

تجربه کاربری

کشش افکت اسکرول

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

در اندروید ۱۱ و پایین‌تر، رویداد overscroll باعث می‌شود عناصر بصری درخشش داشته باشند؛ در اندروید ۱۲ و بالاتر، عناصر بصری با رویداد drag کشیده شده و به حالت اولیه برمی‌گردند و با رویداد fling به حالت اولیه برمی‌گردند و جابجا می‌شوند.

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

صفحات نمایش برنامه

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

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

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

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

وضوح هدف وب

از اندروید ۱۲ (سطح API 31)، یک web intent عمومی فقط در صورتی به یک activity در برنامه شما resolve می‌شود که برنامه شما برای دامنه خاص موجود در آن web intent تأیید شده باشد. اگر برنامه شما برای دامنه تأیید نشده باشد، web intent به جای آن به برنامه مرورگر پیش‌فرض کاربر resolve می‌شود.

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

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

بهبودهای حالت فراگیر برای ناوبری با ژست‌های حرکتی

اندروید ۱۲ رفتارهای موجود را یکپارچه می‌کند تا کاربران بتوانند در حالت همه‌جانبه، دستورات ناوبری حرکتی را آسان‌تر اجرا کنند . علاوه بر این، اندروید ۱۲ برای حالت همه‌جانبه‌ی چسبنده، سازگاری با نسخه‌های قبلی را فراهم می‌کند.

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

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

در اندروید ۱۲ ما همچنان استفاده از WindowMetrics را توصیه می‌کنیم و این متدها را منسوخ می‌کنیم:

برای کاهش رفتار برنامه‌هایی که از رابط‌های برنامه‌نویسی کاربردی (API) نمایشگر (Display APIs) برای بازیابی مرزهای برنامه استفاده می‌کنند، اندروید ۱۲ مقادیری را که توسط APIها برای برنامه‌هایی که به طور کامل قابل تغییر اندازه نیستند، برمی‌گرداند، محدود می‌کند. این می‌تواند بر برنامه‌هایی که از این اطلاعات با MediaProjection استفاده می‌کنند، تأثیر بگذارد.

برنامه‌ها باید از APIهای WindowMetrics برای پرس‌وجو در مورد مرزهای پنجره خود و Configuration.densityDpi برای پرس‌وجو در مورد چگالی فعلی استفاده کنند.

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

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

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

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

اگر برنامه شما یک MediaProjection ایجاد می‌کند، مرزها باید به درستی اندازه‌گذاری شوند زیرا این تصویر، پارتیشن نمایشگری را که برنامه پروژکتور در آن اجرا می‌شود، ضبط می‌کند.

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

کاتلین

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();

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

اندروید ۱۲ حالت چند پنجره‌ای را به یک رفتار استاندارد تبدیل می‌کند.

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

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

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

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

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

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

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

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

عملکرد

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

اندروید ۱۱ (سطح API 30) سطل محدود را به عنوان سطل آماده به کار برنامه معرفی کرد. از اندروید ۱۲، این سطل به طور پیش‌فرض فعال است. سطل محدود کمترین اولویت (و بالاترین محدودیت‌ها) را در بین تمام سطل‌ها دارد. سطل‌ها به ترتیب اولویت از بالا به پایین عبارتند از:

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

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

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

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

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

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

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

adb shell am set-standby-bucket PACKAGE_NAME restricted

مکان پیش‌زمینه و صرفه‌جویی در مصرف باتری

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

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

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

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

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

مکان تقریبی

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

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

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

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

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

تنظیمات میکروفون و دوربین

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

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

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

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

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

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

قابلیت مشاهده بسته مجوز

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

پیاده‌سازی BouncyCastle حذف شد

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

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

  • برنامه شما از اندازه کلیدهای ۵۱۲ بیتی استفاده می‌کند. Conscrypt از این اندازه کلید پشتیبانی نمی‌کند. در صورت لزوم، منطق رمزنگاری برنامه خود را به‌روزرسانی کنید تا از اندازه‌های کلید متفاوتی استفاده کند.
  • برنامه شما با KeyGenerator از اندازه‌های کلید نامعتبر استفاده می‌کند. پیاده‌سازی KeyGenerator در Conscrypt، در مقایسه با BouncyCastle، اعتبارسنجی بیشتری روی پارامترهای کلید انجام می‌دهد. برای مثال، Conscrypt به برنامه شما اجازه نمی‌دهد که یک کلید AES 64 بیتی تولید کند زیرا AES فقط از کلیدهای 128، 192 و 256 بیتی پشتیبانی می‌کند.

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

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

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

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

متن داخل پیام toast شامل فرمت زیر است: APP pasted from your clipboard.

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

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

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

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

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

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

استثنائات

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

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

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

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

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

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

برنامه‌های آسیب‌دیده

این تغییر روی برنامه‌هایی تأثیر می‌گذارد که اجازه می‌دهند لمس‌ها از پنجره‌هایشان عبور کنند، برای مثال با استفاده از پرچم FLAG_NOT_TOUCHABLE . چندین مثال شامل موارد زیر است، اما محدود به آنها نیست:

  • پوشش‌هایی که به مجوز SYSTEM_ALERT_WINDOW نیاز دارند، مانند پنجره‌هایی که از TYPE_APPLICATION_OVERLAY استفاده می‌کنند و از پرچم FLAG_NOT_TOUCHABLE استفاده می‌کنند.
  • پنجره‌های فعالیتی که از پرچم FLAG_NOT_TOUCHABLE استفاده می‌کنند.

استثنائات

در موارد زیر، لمس‌های «عبور» مجاز هستند:

  • تعاملات درون برنامه شما. برنامه شما پوشش را نشان می‌دهد و این پوشش فقط زمانی ظاهر می‌شود که کاربر با برنامه شما در تعامل باشد.
  • پنجره‌های مورد اعتماد. این پنجره‌ها شامل موارد زیر می‌شوند (اما محدود به آنها نیستند):

  • پنجره‌های نامرئی. نمای ریشه پنجره GONE یا INVISIBLE است.

  • پنجره‌های کاملاً شفاف. مقدار alpha برای پنجره 0.0 است.

  • پنجره‌های هشدار سیستمی به اندازه کافی شفاف. سیستم مجموعه‌ای از پنجره‌های هشدار سیستمی را زمانی به اندازه کافی شفاف در نظر می‌گیرد که میزان شفافیت ترکیبی آنها کمتر یا مساوی حداکثر میزان شفافیت سیستم برای لمس‌ها باشد. در اندروید ۱۲، این حداکثر شفافیت به طور پیش‌فرض ۰.۸ است.

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

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

Untrusted touch due to occlusion by PACKAGE_NAME

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

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

چرخه حیات فعالیت

فعالیت‌های روت لانچر دیگر با فشردن دکمه‌ی برگشت (Back) تمام نمی‌شوند.

اندروید ۱۲ نحوه‌ی مدیریت پیش‌فرض سیستم در هنگام فشردن دکمه‌ی برگشت (Back press) روی فعالیت‌های لانچر که در ریشه‌ی وظایف خود قرار دارند را تغییر می‌دهد. در نسخه‌های قبلی، سیستم این فعالیت‌ها را با فشردن دکمه‌ی برگشت (Back press) به پایان می‌رساند. در اندروید ۱۲، سیستم اکنون به جای پایان دادن به فعالیت، فعالیت و وظیفه‌ی آن را به پس‌زمینه منتقل می‌کند. رفتار جدید با رفتار فعلی هنگام خروج از یک برنامه با استفاده از دکمه‌ی خانه یا ژست حرکتی مطابقت دارد.

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

توصیه می‌کنیم برنامه‌های خود را با این تغییر آزمایش کنید. اگر برنامه شما در حال حاضر برای مدیریت ناوبری برگشت و پایان دادن به Activity ، از onBackPressed() استفاده می‌کند، پیاده‌سازی خود را به‌روزرسانی کنید تا به جای اتمام، از super.onBackPressed() استفاده کند. فراخوانی super.onBackPressed() در صورت لزوم، activity و وظیفه آن را به پس‌زمینه منتقل می‌کند و تجربه ناوبری سازگارتری را برای کاربران در بین برنامه‌ها فراهم می‌کند.

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

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

تغییر نرخ نوسازی بهبود یافته

در اندروید ۱۲، تغییرات نرخ تازه‌سازی با استفاده از 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);

اتصال

به‌روزرسانی‌های نقطه عبور

API های زیر در اندروید ۱۲ اضافه شده اند:

  • isPasspointTermsAndConditionsSupported() : شرایط و ضوابط یک ویژگی Passpoint است که به استقرارهای شبکه اجازه می‌دهد تا پورتال‌های Captive ناامن، که از شبکه‌های باز استفاده می‌کنند، را با یک شبکه Passpoint امن جایگزین کنند. هنگامی که شرایط و ضوابط مورد نیاز برای پذیرش باشند، یک اعلان به کاربر نمایش داده می‌شود. برنامه‌هایی که شبکه‌های Passpoint را پیشنهاد می‌دهند که توسط شرایط و ضوابط محدود شده‌اند، ابتدا باید این API را فراخوانی کنند تا مطمئن شوند که دستگاه از این قابلیت پشتیبانی می‌کند. اگر دستگاه از این قابلیت پشتیبانی نکند، نمی‌تواند به این شبکه متصل شود و باید یک شبکه جایگزین یا قدیمی پیشنهاد شود.
  • isDecoratedIdentitySupported() : هنگام احراز هویت در شبکه‌هایی با پیشوند تزئینی، پیشوند هویت تزئینی به اپراتورهای شبکه اجازه می‌دهد تا شناسه دسترسی به شبکه (NAI) را به‌روزرسانی کنند تا مسیریابی صریح را از طریق چندین پروکسی درون یک شبکه AAA انجام دهند (برای اطلاعات بیشتر در این مورد به RFC 7542 مراجعه کنید).

    اندروید ۱۲ این ویژگی را برای مطابقت با مشخصات WBA برای افزونه‌های PPS-MO پیاده‌سازی کرده است. برنامه‌هایی که شبکه‌های Passpoint را پیشنهاد می‌دهند که نیاز به هویت تزئین‌شده دارند، ابتدا باید این API را فراخوانی کنند تا مطمئن شوند که دستگاه از این قابلیت پشتیبانی می‌کند. اگر دستگاه از این قابلیت پشتیبانی نکند، هویت تزئین‌شده نخواهد بود و احراز هویت در شبکه ممکن است با شکست مواجه شود.

برای ایجاد پیشنهاد Passpoint، برنامه‌ها باید از کلاس‌های PasspointConfiguration ، Credential و HomeSp استفاده کنند. این کلاس‌ها، پروفایل Passpoint را که در مشخصات Wi-Fi Alliance Passpoint تعریف شده است، توصیف می‌کنند.

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

محدودیت‌های رابط کاربری غیر SDK به‌روزرسانی شد.

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

اگر برنامه شما اندروید ۱۲ را هدف قرار نمی‌دهد، ممکن است برخی از این تغییرات بلافاصله شما را تحت تأثیر قرار ندهند. با این حال، اگرچه در حال حاضر می‌توانید از برخی رابط‌های غیر SDK ( بسته به سطح API هدف برنامه خود ) استفاده کنید، استفاده از هر روش یا فیلد غیر SDK همیشه خطر بالای خرابی برنامه شما را به همراه دارد.

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

برای کسب اطلاعات بیشتر در مورد تغییرات این نسخه از اندروید، به «به‌روزرسانی محدودیت‌های رابط‌های غیر SDK در اندروید ۱۲» مراجعه کنید. برای کسب اطلاعات بیشتر در مورد رابط‌های غیر SDK به طور کلی، به «محدودیت‌های رابط‌های غیر SDK» مراجعه کنید.