ویژگی‌ها و میاناهای برنامه‌سازی کاربردی Android 8.0

Android 8.0 (میانای برنامه‌سازی کاربردی سطح ۲۶) انواع مختلفی از ویژگی‌ها و قابلیت‌های جدید را برای کاربران و توسعه‌دهندگان معرفی می‌کند. این سند موارد جدید برای توسعه‌دهندگان را برجسته می‌کند.

حتماً تغییرات رفتار Android 8.0 را نیز بررسی کنید تا با بخش‌هایی که تغییرات پلاتفرم ممکن است بر برنامه‌هایتان تأثیر بگذارد آشنا شوید.

تجربه کاربر

حالت تصویردرتصویر

تصویردرتصویر در Android 8.0.

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) به فعالیت‌ها اجازه می‌دهد در حالت تصویردرتصویر (PIP) راه‌اندازی شوند. «تصویردرتصویر» نوع خاصی از حالت چندپنجره‌ای است که بیشتر برای بازپخش ویدیو استفاده می‌شود. حالت «تصویر در تصویر» در ابتدا فقط برای Android TV دردسترس بود؛ Android 8.0 این ویژگی را در سایر دستگاه‌های Android دردسترس قرار می‌دهد.

وقتی فعالیتی در حالت «تصویر در تصویر» است، در وضعیت موقتاً متوقف‌شده قرار دارد، اما باید به نمایش محتوا ادامه دهد. به همین دلیل، باید مطمئن شوید که برنامه‌تان بازپخش را در گرداننده onPause() خود موقتاً متوقف نمی‌کند. درعوض، باید ویدیو را در onStop() موقتاً متوقف کنید و بازپخش را در onStart() ازسر بگیرید. برای اطلاعات بیشتر، به چرخه حیات چندپنجره‌ای مراجعه کنید.

برای مشخص کردن اینکه فعالیت شما می‌تواند از حالت «تصویر در تصویر» استفاده کند، android:supportsPictureInPicture را در مانیفست روی true تنظیم کنید. (از Android 8.0 به بعد، «تصویر در تصویر» به مشخصه مانیفست android:resizeableActivity نیاز ندارد. بااین‌حال، اگر فعالیتتان از حالت‌های چندپنجره‌ای دیگر پشتیبانی می‌کند، باید android:resizeableActivity را روی `true` تنظیم کنید.)

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) شیء جدیدی به‌نام PictureInPictureParams معرفی می‌کند که آن را به روش‌های «تصویر در تصویر» ارسال می‌کنید تا مشخص کنید فعالیت در حالت «تصویر در تصویر» چگونه باید رفتار کند. این شیء ویژگی‌هایی مثل نسبت ابعادی ترجیحی فعالیت را مشخص می‌کند.

روش‌های موجود PIP که در افزودن تصویردرتصویر شرح داده شده است اکنون می‌تواند در همه دستگاه‌های Android استفاده شود، نه فقط در Android TV. علاوه‌براین، Android 8.0 روش‌های زیر را برای پشتیبانی از حالت «تصویر در تصویر» ارائه می‌دهد:

  • ‫Activity.enterPictureInPictureMode(PictureInPictureParams args): فعالیت را در حالت تصویردرتصویر قرار می‌دهد. نسبت ابعادی فعالیت و دیگر تنظیمات پیکربندی را args مشخص می‌کند. اگر فیلدی در args خالی باشد، سیستم از مقادیری استفاده می‌کند که آخرین باری که Activity.setPictureInPictureParams() را فراخوانی کردید تنظیم شده است.

    فعالیت مشخص‌شده در گوشه‌ای از صفحه‌نمایش قرار می‌گیرد؛ بقیه صفحه‌نمایش با فعالیت قبلی که روی صفحه‌نمایش بود پر می‌شود. فعالیتی که وارد حالت «تصویر در تصویر» می‌شود به حالت موقتاً متوقف‌شده می‌رود، اما همچنان شروع‌شده باقی می‌ماند. اگر کاربر روی فعالیت «تصویر در تصویر» تک‌ضرب بزند، سیستم منویی را برای تعامل کاربر نشان می‌دهد؛ وقتی فعالیت در وضعیت «تصویر در تصویر» باشد، هیچ رویداد لمسی‌ای به آن نمی‌رسد.

  • Activity.setPictureInPictureParams(): تنظیمات پیکربندی «تصویر در تصویر» فعالیت را به‌روز می‌کند. اگر فعالیت درحال‌حاضر در حالت «تصویر در تصویر» باشد، تنظیمات به‌روزرسانی می‌شود؛ این کار زمانی مفید است که نسبت ابعادی فعالیت تغییر کند. اگر فعالیت در حالت «تصویر در تصویر» نباشد، این تنظیمات پیکربندی صرف‌نظر از روش enterPictureInPictureMode() که فراخوانی می‌کنید استفاده می‌شود.

اعلان‌ها

در Android 8.0 (سطح API‏ ۲۶)، اعلان‌ها را بازطراحی کرده‌ایم تا روش آسان‌تر و منسجم‌تری برای مدیریت رفتار و تنظیمات اعلان ارائه دهیم. این تغییرات شامل موارد زیر است:

    منوی فشار طولانی اعلان در Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶).

    کاربران می‌توانند روی نمادهای راه‌انداز برنامه فشار طولانی دهند تا اعلان‌ها را در Android نسخه ۸.۰ مشاهده کنند.

  • کانال‌های اعلان: 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 (سطح API‏ ۲۶) با معرفی «چارچوب تکمیل خودکار»، پر کردن فرم‌ها، مانند فرم‌های ورود به سیستم و کارت اعتباری را آسان‌تر می‌کند. برنامه‌های موجود و جدید پس‌از موافقت کاربر با تکمیل خودکار، با «چارچوب تکمیل خودکار» کار می‌کنند.

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

قلم‌های بارگیری‌شدنی

‫Android نسخه ۸.۰ (سطح API‏ ۲۶) و «کتابخانه پشتیبانی Android» نسخه ۲۶ به شما امکان می‌دهند به‌جای بسته‌بندی قلم‌ها در APK یا اجازه دادن به APK برای بارگیری قلم‌ها، قلم‌ها را از برنامه ارائه‌دهنده درخواست کنید. این ویژگی اندازه APK را کاهش می‌دهد، نرخ موفقیت نصب برنامه را افزایش می‌دهد، و به چند برنامه اجازه می‌دهد از یک قلم استفاده کنند.

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

قلم‌ها در XML

‫Android 8.0 (سطح API‏ ۲۶) ویژگی جدیدی به‌نام «قلم‌ها در XML» معرفی می‌کند که به شما امکان می‌دهد از قلم‌ها به‌عنوان منابع استفاده کنید. این یعنی نیازی به بسته‌بندی قلم‌ها به‌عنوان دارایی نیست. قلم‌ها در فایل R کامپایل می‌شوند و به‌طور خودکار به‌عنوان منبع در سیستم دردسترس قرار می‌گیرند. سپس می‌توانید با کمک نوع منبع جدید، font، به این قلم‌ها دسترسی پیدا کنید.

«کتابخانه پشتیبانی ۲۶» پشتیبانی کامل از این ویژگی را در دستگاه‌های دارای میانای برنامه‌سازی کاربردی نسخه ۱۴ و بالاتر ارائه می‌دهد.

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

Autosizing TextView

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) به شما امکان می‌دهد اندازه نوشتار را به‌طور خودکار براساس اندازه TextView تنظیم کنید تا بزرگ یا کوچک شود. این یعنی بهینه‌سازی اندازه نوشتار در صفحه‌نمایش‌های مختلف یا با محتوای پویا بسیار آسان‌تر است. برای اطلاعات بیشتر درباره تغییر اندازه خودکار TextView در Android 8.0، تغییر اندازه خودکار TextView را ببینید.

نمادهای تطبیق‌پذیر

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

مدیریت رنگ

توسعه‌دهندگان Android برنامه‌های تصویربرداری اکنون می‌توانند از دستگاه‌های جدیدی که نمایشگر با قابلیت طیف رنگی گسترده دارند بهره ببرند. برای نمایش تصاویر با طیف گسترده، برنامه‌ها باید پرچمی را در مانیفست خود (به‌ازای هر فعالیت) فعال کنند و بیت‌مپ‌ها را با نمایه رنگی گسترده جاسازی‌شده (AdobeRGB،‏ Pro Photo RGB،‏ DCI-P3، و غیره) بار کنند.

WebView APIs

‫Android نسخه ۸.۰ چندین میانای برنامه‌سازی کاربردی ارائه می‌دهد تا به شما کمک کند اشیاء WebView را که محتوای وب را در برنامه‌تان نمایش می‌دهند مدیریت کنید. این میاناهای برنامه‌سازی کاربردی که پایداری و امنیت برنامه‌تان را بهبود می‌بخشند شامل موارد زیر هستند:

  • میانای برنامه‌سازی کاربردی نسخه
  • Google SafeBrowsing API
  • Termination Handle API
  • Renderer Importance API

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

کلاس WebView اکنون شامل Safe Browsing API برای بهبود امنیت مرور وب است. برای اطلاعات بیشتر، Google Safe Browsing API را ببینید.

سنجاق کردن میان‌برها و ابزاره‌ها

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) سنجاق کردن میان‌برها و ابزارک‌ها را در برنامه معرفی می‌کند. در برنامه‌تان، می‌توانید میان‌برها و ابزاره‌های سنجاق‌شده برای راه‌اندازهای پشتیبانی‌شده ایجاد کنید، مشروط به اجازه کاربر.

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

حداکثر نسبت ابعادی صفحه‌نمایش

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) تغییراتی در نحوه پیکربندی حداکثر نسبت ابعادی برنامه ایجاد می‌کند.

ابتدا، Android 8.0 ویژگی maxAspectRatio را معرفی می‌کند که می‌توانید از آن برای تنظیم حداکثر نسبت ابعادی برنامه‌تان استفاده کنید. علاوه‌براین، در Android 8.0 و بالاتر، حداکثر نسبت ابعادی پیش‌فرض برنامه، نسبت ابعادی اصلی دستگاهی است که برنامه در آن اجرا می‌شود.

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

پشتیبانی از چند نمایشگر

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

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

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

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

‫ActivityOptions دو روش جدید برای پشتیبانی از چند نمایشگر ارائه می‌دهد:

setLaunchDisplayId()
مشخص می‌کند که فعالیت هنگام راه‌اندازی باید در کدام نمایشگر نشان داده شود.
getLaunchDisplayId()
نمایشگر راه‌اندازی فعلی فعالیت را برمی‌گرداند.

پوسته adb برای پشتیبانی از چند نمایشگر گسترش یافته است. اکنون می‌توان از فرمان shell start برای راه‌اندازی فعالیت و مشخص کردن نمایشگر هدف فعالیت استفاده کرد:

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

حاشیه‌ها و فاصله‌گذاری‌های چیدمان یکپارچه

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) مشخص کردن موقعیت‌هایی را که در آن طرف‌های مقابل عنصر View از حاشیه یا لایه یکسان استفاده می‌کنند برای شما آسان‌تر می‌کند. به‌طور خاص، اکنون می‌توانید از مشخصه‌های زیر در فایل‌های XML چیدمانتان استفاده کنید:

توجه: اگر منطق برنامه‌تان را برای پشتیبانی از زبان‌ها و فرهنگ‌های مختلف، ازجمله جهت نوشتار، سفارشی‌سازی می‌کنید، به‌خاطر داشته باشید که این ویژگی‌ها بر مقادیر layout_marginStart، layout_marginEnd، paddingStart، یا paddingEnd تأثیر نمی‌گذارند. می‌توانید این مقادیر را خودتان تنظیم کنید، علاوه‌بر مشخصه‌های چیدمان عمودی و افقی جدید، برای ایجاد رفتار چیدمان که به جهت نوشتار بستگی دارد.

ضبط اشاره‌گر

برخی‌از برنامه‌ها، مانند بازی‌ها، میز کار ازراه‌دور، و کلاینت‌های مجازی‌سازی، از به‌دست گرفتن کنترل اشاره‌گر موشواره بسیار بهره می‌برند. ضبط اشاره‌گر ویژگی جدیدی در Android 8.0 (سطح API‏ ۲۶) است که با ارائه همه رویدادهای موشواره به نمای متمرکز در برنامه شما، چنین کنترلی را فراهم می‌کند.

از Android 8.0 به بعد، View در برنامه شما می‌تواند درخواست ضبط اشاره‌گر کند و شنونده‌ای برای پردازش رویدادهای اشاره‌گر ضبط‌شده تعریف کند. در این حالت، اشاره‌گر موشواره پنهان است. وقتی نما دیگر به اطلاعات موشواره نیاز نداشته باشد، می‌تواند ضبط اشاره‌گر را رها کند. همچنین وقتی نمای موردنظر تمرکز را ازدست می‌دهد، مثلاً وقتی کاربر برنامه دیگری را باز می‌کند، سیستم می‌تواند ضبط اشاره‌گر را رها کند.

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

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

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) به هر برنامه اجازه می‌دهد دسته‌ای را که در آن قرار می‌گیرد، درصورت لزوم، اعلام کند. این دسته‌ها برای خوشه‌بندی برنامه‌هایی با هدف یا عملکرد مشابه هنگام ارائه آن‌ها به کاربران استفاده می‌شوند، مانند «مصرف داده»، «مصرف باتری»، یا «مصرف فضای ذخیره‌سازی». می‌توانید با تنظیم مشخصه android:appCategory در برچسب مانیفست <application>، دسته‌ای برای برنامه‌تان تعریف کنید.

راه‌انداز Android TV

Android 8.0 (سطح API‏ ۲۶) شامل یک تجربه صفحه اصلی Android TV محتوا-محور جدید است که با شبیه‌ساز Android TV و تصویر دستگاه Nexus Player برای Android 8.0 دردسترس است. صفحه اصلی جدید محتوای ویدیویی را در ردیف‌های مربوط به کانال‌ها سازمان‌دهی می‌کند که هرکدام با برنامه‌هایی از یک برنامه در سیستم پر شده‌اند. برنامه‌ها می‌توانند چندین کانال منتشر کنند و کاربران می‌توانند کانال‌هایی را که می‌خواهند در صفحه اصلی ببینند پیکربندی کنند. صفحه اصلی Android TV همچنین شامل ردیف «تماشای بعدی» است که براساس عادات تماشای کاربر، با برنامه‌هایی از برنامه‌ها پر می‌شود. برنامه‌ها همچنین می‌توانند پیش‌نمایش‌های ویدیویی ارائه دهند که وقتی کاربر روی برنامه‌ای تمرکز می‌کند، به‌طور خودکار پخش می‌شوند. میاناهای برنامه‌سازی کاربردی برای پر کردن کانال‌ها و برنامه‌ها بخشی از میاناهای برنامه‌سازی کاربردی TvProvider هستند که به‌عنوان یک ماژول کتابخانه پشتیبانی Android با Android 8.0 توزیع می‌شوند.

AnimatorSet

از Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶)، میانای برنامه‌سازی کاربردی AnimatorSet اکنون از جستجو و پخش در جهت معکوس پشتیبانی می‌کند. جستجو به شما امکان می‌دهد موقعیت مجموعه پویانمایی را روی نقطه خاصی از زمان تنظیم کنید. پخش معکوس زمانی مفید است که برنامه شما شامل پویانمایی‌هایی برای کنش‌هایی باشد که می‌توانند واگرد شوند. به‌جای تعریف دو مجموعه پویانمایی جداگانه، می‌توانید همان پویانمایی را به‌صورت معکوس پخش کنید.

ورودی و پیمایش

خوشه‌های پیمایش صفحه‌کلید

اگر فعالیتی در برنامه‌تان از سلسله‌مراتب نمای پیچیده‌ای استفاده می‌کند، مثل آنچه در شکل ۲ نشان داده شده است، گروه‌های عناصر میانای کاربر را در خوشه‌هایی سازمان‌دهی کنید تا پیمایش صفحه‌کلید بین آن‌ها آسان‌تر شود. کاربران می‌توانند با فشار دادن Meta+Tab، یا Search+Tab در دستگاه‌های Chromebook، از یک خوشه به خوشه دیگر پیمایش کنند. نمونه‌های خوب از خوشه‌ها عبارت‌اند از: پانل‌های کناری، نوارهای پیمایش، نواحی محتوای اصلی، و عناصری که می‌توانند شامل عناصر فرزند زیادی باشند.

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

برای تبدیل کردن عنصر View یا ViewGroup به خوشه، مشخصه android:keyboardNavigationCluster را در فایل XML چیدمان عنصر روی true تنظیم کنید یا true را در منطق واسط کاربر برنامه‌تان به setKeyboardNavigationCluster() ارسال کنید.

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

در دستگاه‌هایی که صفحه لمسی دارند، می‌توانید عنصر android:touchscreenBlocksFocus شیء ViewGroup تعیین‌شده برای خوشه را روی true تنظیم کنید تا پیمایش فقط خوشه‌ای به داخل و خارج از آن خوشه مجاز شود. اگر این پیکربندی را برای خوشه‌ای اعمال کنید، کاربران نمی‌توانند از کلید Tab یا کلیدهای جهت‌نما برای پیمایش به داخل یا خارج از خوشه استفاده کنند؛ درعوض، باید ترکیب صفحه‌کلید پیمایش خوشه را فشار دهند.

نمای تمرکز پیش‌فرض

در Android 8.0 (سطح API‏ ۲۶)، می‌توانید View را اختصاص دهید که باید پس‌از ازسرگیری فعالیت (مجدداً) ایجادشده و فشار دادن کلید پیمایش صفحه‌کلید (مانند کلید tab) توسط کاربر، تمرکز را دریافت کند. برای اعمال این تنظیم «به‌طور پیش‌فرض متمرکزشده»، مشخصه android:focusedByDefault عنصر View را در فایل XML چیدمان حاوی عنصر میانای کاربر روی true تنظیم کنید، یا true را به setFocusedByDefault() در منطق میانای کاربر برنامه‌تان ارسال کنید.

خروجی گفتار

فعالیت‌ها و سرویس‌ها می‌توانند از نمونه‌های TextToSpeech برای دیکته کردن و تلفظ محتوا استفاده کنند. از Android 8.0 (سطح API‏ ۲۶)، برنامه شما می‌تواند اطلاعات زمان‌بندی دقیق‌تری درباره زمان شروع صحبت کردن موتور نوشتار به گفتار با کلمات ترکیبی مجزا به‌دست آورد، به‌شرطی که موتور این اطلاعات را ارائه دهد. می‌توانید از این عملکرد برای جلب توجه به کلمات خاصی که موتور نوشتار به گفتار آن‌ها را می‌خواند استفاده کنید.

برای استفاده از این بهبودهای موتور نوشتار به گفتار در برنامه‌تان، نمونه‌ای از UtteranceProgressListener را ثبت کنید. به‌عنوان بخشی از فرایند ثبت‌نام، یک گرداننده برای روش onRangeStart() اضافه کنید.

موتور نوشتار به گفتار rangeStart() را برای ضبط نقطه زمانی‌ای که انتظار دارد بازپخش صوتی محدوده خاصی از نوشتار شروع شود فراخوانی می‌کند. وقتی پخش صدای آن محدوده نوشتار شروع می‌شود، روش onRangeStart() برنامه‌تان اجرا می‌شود. سپس برنامه شما می‌تواند به این فراخوانی پاسخ دهد، مثلاً با برجسته کردن محدوده نوشتاری که با گفته مرتبط است.

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

سیستم

آشکارسازهای StrictMode جدید

‫Android 8.0 (سطح API‏ ۲۶) سه آشکارساز StrictMode جدید اضافه می‌کند تا به شناسایی اشکالات احتمالی در برنامه‌تان کمک کند:

  • detectUnbufferedIo() تشخیص می‌دهد که برنامه شما چه زمانی داده‌ها را بدون میان‌گیری می‌خواند یا می‌نویسد، که می‌تواند تأثیر شدیدی بر عملکرد داشته باشد.
  • detectContentUriWithoutPermission() تشخیص می‌دهد که برنامه‌تان چه زمانی به‌طور تصادفی فراموش می‌کند هنگام شروع «فعالیت» در خارج از برنامه‌تان، به برنامه دیگری اجازه اعطا کند.
  • detectUntaggedSockets() تشخیص می‌دهد که برنامه‌تان چه زمانی ترافیک شبکه را بدون استفاده از setThreadStatsTag(int) برای برچسب‌گذاری ترافیکتان برای اهداف اشکال‌زدایی انجام می‌دهد.

داده‌های موجود در حافظه پنهان

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) راهنمایی و رفتارهای بهتری درباره داده‌های ذخینه‌شده در حافظه پنهان ارائه می‌دهد. اکنون به هر برنامه سهمیه فضای دیسک برای داده‌های ذخیره‌شده در حافظه نهان اختصاص داده می‌شود، که توسط getCacheQuotaBytes(UUID) برگردانده می‌شود.

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

همچنین دو رفتار جدید وجود دارد که می‌توانید آن‌ها را به‌صورت جداگانه برای هر دایرکتوری فعال کنید تا نحوه آزادسازی داده‌های ذخیره‌شده در حافظه نهان توسط سیستم را کنترل کنید:

  • StorageManager.setCacheBehaviorAtomic() می‌تواند برای نشان دادن اینکه یک دایرکتوری و همه محتوای آن باید به‌عنوان یک واحد اتمی واحد حذف شود استفاده شود.
  • از setCacheBehaviorTombstone(File, boolean) می‌توان برای نشان دادن این موضوع استفاده کرد که به‌جای حذف فایل‌های داخل فهرست راهنما، باید آن‌ها را کوتاه کرد تا طولشان ۰ بایت شود و فایل خالی دست‌نخورده باقی بماند.

درنهایت، وقتی لازم است فضای دیسک را به فایل‌های بزرگ اختصاص دهید، از allocateBytes(FileDescriptor, long) API جدید استفاده کنید که به‌طور خودکار فایل‌های ذخیره‌شده در حافظه نهان متعلق به برنامه‌های دیگر را (درصورت نیاز) پاک می‌کند تا درخواست شما برآورده شود. هنگام تصمیم‌گیری درباره اینکه آیا دستگاه فضای دیسک کافی برای نگهداری داده‌های جدید شما دارد یا نه، به‌جای استفاده از getUsableSpace()، getAllocatableBytes(UUID) را فراخوانی کنید، زیرا مورد اول هرگونه داده ذخیره‌شده در حافظه نهان را که سیستم مایل است ازطرف شما پاک کند درنظر می‌گیرد.

صفحه‌بندی ارائه‌دهنده محتوا

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

برای اطلاعات دقیق درباره تغییرات ارائه‌دهندگان محتوا، به ContentProvider و ContentProviderClient مراجعه کنید.

درخواست‌های بازآوری محتوا

کلاس‌های ContentProvider و ContentResolver اکنون هرکدام شامل یک refresh() روش هستند که به مشتریان کمک می‌کند راحت‌تر بدانند آیا اطلاعاتی که درخواست می‌کنند به‌روز است یا نه.

می‌توانید با گسترش دادن ContentProvider، منطق بازآوری محتوای سفارشی اضافه کنید. مطمئن شوید که روش refresh() را برای برگرداندن true لغو می‌کنید، که به مشتریان ارائه‌دهنده شما نشان می‌دهد که خودتان تلاش کرده‌اید داده‌ها را بازآوری کنید.

برنامه کارخواه شما می‌تواند با فراخوانی روشی متفاوت، که آن هم refresh() نامیده می‌شود، صریحاً درخواست محتوای بازآوری‌شده کند. هنگام فراخوانی این روش، شناسه منبع یکسان داده را برای بازآوری کردن ارسال کنید.

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

بهبودهای JobScheduler

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) تعدادی بهبود در JobScheduler معرفی می‌کند. این بهبودها باعث می‌شود برنامه‌تان راحت‌تر بتواند محدودیت‌های اجرای پس‌زمینه جدید را رعایت کند، زیرا به‌طور کلی می‌توانید از کارهای زمان‌بندی‌شده برای جایگزینی سرویس‌های پس‌زمینه یا گیرنده‌های رویداد ثبت‌شده غیرصریح که اکنون محدود شده‌اند استفاده کنید.

به‌روزرسانی‌های JobScheduler شامل موارد زیر است:

  • اکنون می‌توانید صف کاری را با کار زمان‌بندی‌شده مرتبط کنید. برای افزودن مورد کاری به صف کار، با JobScheduler.enqueue() تماس بگیرید. وقتی کار درحال اجرا است، می‌تواند کار معلق را از صف بردارد و آن را پردازش کند. این عملکرد بسیاری از موارد استفاده را که قبلاً نیاز به راه‌اندازی سرویس پس‌زمینه‌ای داشتند، به‌ویژه سرویس‌هایی که IntentService را پیاده‌سازی می‌کنند، مدیریت می‌کند.
  • کتابخانه پشتیبانی Android نسخه ۲۶.۰.۰ کلاس جدید JobIntentService را معرفی می‌کند که عملکردی مشابه IntentService ارائه می‌دهد اما هنگام اجرا در Android نسخه ۸.۰ (سطح میانای برنامه‌سازی کاربردی ۲۶) یا بالاتر، به‌جای سرویس‌ها از کارها استفاده می‌کند.
  • اکنون می‌توانید JobInfo.Builder.setClipData() را فراخوانی کنید تا ClipData را با کاری مرتبط کنید. این گزینه به شما امکان می‌دهد اعطای اجازه URI را با کار مرتبط کنید، مشابه با نحوه انتشار این اجازه‌ها در Context.startService(). همچنین می‌توانید از اعطای اجازه URI با قصدها در صف‌های کاری استفاده کنید.
  • کارهای زمان‌بندی‌شده اکنون از چندین محدودیت جدید پشتیبانی می‌کنند:
    JobInfo.isRequireStorageNotLow()
    اگر فضای ذخیره‌سازی دردسترس دستگاه کم باشد، کار اجرا نمی‌شود.
    JobInfo.isRequireBatteryNotLow()
    اگر سطح باتری در آستانه بحرانی یا پایین‌تر از آن باشد، کار اجرا نمی‌شود؛ این سطحی است که دستگاه کادر گفتگوی سیستم هشدار باتری کم را نشان می‌دهد.
    NETWORK_TYPE_METERED
    کار به اتصال شبکه سنجشی نیاز دارد، مثل اکثر طرح‌های داده تلفن همراه.

فضای ذخیره‌سازی داده‌های سفارشی

Android 8.0 (سطح API‏ ۲۶) به شما امکان می‌دهد فضای ذخیره‌سازی داده سفارشی برای اولویت‌هایتان ارائه دهید، که می‌تواند مفید باشد اگر برنامه‌تان اولویت‌ها را در پایگاه داده ابری یا محلی ذخیره کند، یا اگر اولویت‌ها مختص دستگاه باشد. برای اطلاعات بیشتر درباره پیاده‌سازی ذخیره‌سازی داده، به ذخیره‌سازی داده سفارشی مراجعه کنید.

بهبودهای رسانه

VolumeShaper

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

بهبودهای اولویت صوتی

برنامه‌های صوتی با درخواست و رها کردن تمرکز صوتی، خروجی صوتی را در دستگاه هم‌رسانی می‌کنند. برنامه با شروع یا توقف بازپخش، یا کاهش صدای آن، تغییرات در تمرکز را مدیریت می‌کند. کلاس AudioFocusRequest جدیدی وجود دارد. بااستفاده از این کلاس به‌عنوان پارامتر requestAudioFocus()، برنامه‌ها قابلیت‌های جدیدی هنگام مدیریت تغییرات در تمرکز صوتی دارند: کاهش خودکار صدای پس‌زمینه و به‌دست آوردن تمرکز با تأخیر.

سنجه‌های رسانه

روش جدید getMetrics() یک شیء PersistableBundle برمی‌گرداند که حاوی اطلاعات پیکربندی و عملکرد است و به‌صورت نقشه‌ای از مشخصه‌ها و مقادیر بیان می‌شود. روش getMetrics() برای این کلاس‌های رسانه تعریف شده است:

سنجه‌ها به‌طور جداگانه برای هر نمونه جمع‌آوری می‌شوند و برای طول عمر نمونه باقی می‌مانند. اگر هیچ سنجه‌ای دردسترس نباشد، این روش null را برمی‌گرداند. سنجه‌های واقعی برگردانده‌شده به کلاس بستگی دارد.

MediaPlayer

از Android نسخه ۸.۰ (سطح میانای برنامه کاربردی ۲۶) به بعد، MediaPlayer می‌تواند مطالب محافظت‌شده با مدیریت حقوق دیجیتال و رسانه‌های رمزگذاری‌شده در سطح نمونه HLS را بازپخش کند.

‫Android 8.0 فرمان جدید seekTo() را معرفی می‌کند که کنترل دقیقی هنگام جستجوی فریم ارائه می‌دهد. این شامل پارامتر دومی است که حالت جستجو را مشخص می‌کند:

  • SEEK_PREVIOUS_SYNC موقعیت رسانه را به قاب همگام‌سازی (یا کلید) مرتبط با منبع داده‌ای که درست قبل یا در زمان مشخص‌شده قرار دارد منتقل می‌کند.
  • SEEK_NEXT_SYNC موقعیت رسانه را به قاب همگام‌سازی (یا کلید) مرتبط با منبع داده‌ای که درست بعداز یا در زمان مشخص‌شده قرار دارد منتقل می‌کند.
  • SEEK_CLOSEST_SYNC موقعیت رسانه را به قاب همگام‌سازی (یا کلید) منسوب به منبع داده‌ای که در نزدیک‌ترین زمان یا در زمان داده‌شده قرار دارد منتقل می‌کند.
  • ‫SEEK_CLOSEST موقعیت رسانه را به قابی (نه لزوماً قاب همگام‌سازی یا کلیدی) منتقل می‌کند که با منبع داده‌ای مرتبط است که در نزدیک‌ترین زمان یا در زمان مشخص‌شده قرار دارد.

هنگام جستجوی مداوم، برنامه‌ها باید از هریک از حالت‌های SEEK_ به‌جای SEEK_CLOSEST استفاده کنند که نسبتاً کندتر اجرا می‌شود اما می‌تواند دقیق‌تر باشد.

MediaRecorder

  • ‫MediaRecorder اکنون از قالب MPEG2_TS پشتیبانی می‌کند که برای جاری‌سازی مفید است:

    کاتلین

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)

    جاوا

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

    MediaRecorder.OutputFormat را ببینید

  • MediaMuxer اکنون می‌تواند هر تعداد جاری‌سازی صوتی و تصویری را مدیریت کند. دیگر به یک قطعه صوتی و/یا یک قطعه ویدیویی محدود نیستید. از addTrack() برای ترکیب کردن هر تعداد قطعه که می‌خواهید استفاده کنید.
  • MediaMuxer همچنین می‌تواند یک یا چند قطعه فراداده حاوی اطلاعات تعریف‌شده توسط کاربر برای هر فریم اضافه کند. قالب فراداده توسط برنامه شما تعریف می‌شود. قطعه فراداده فقط برای محفظه‌های MP4 پشتیبانی می‌شود.

فراداده می‌تواند برای پردازش آفلاین مفید باشد. برای مثال، سیگنال‌های ژیروسکوپ از حسگر می‌تواند برای تثبیت ویدیو استفاده شود.

هنگام افزودن قطعه فراداده، قالب mime قطعه باید با پیشوند «application/‎» شروع شود. نوشتن فراداده مانند نوشتن داده‌های ویدیو/صدا است، با این تفاوت که داده‌ها از MediaCodec نمی‌آیند. درعوض، برنامه یک ByteBuffer با مُهر زمان مرتبط به روش writeSampleData() ارسال می‌کند. مُهر زمان باید در همان پایه زمانی قطعه‌های ویدیویی و صوتی باشد.

فایل MP4 تولیدشده از TextMetaDataSampleEntry تعریف‌شده در بخش 12.3.3.2 ISOBMFF برای نشان دادن قالب mime فراداده استفاده می‌کند. هنگام استفاده از MediaExtractor برای استخراج فایل با قطعه فراداده، قالب mime فراداده در MediaFormat استخراج خواهد شد.

دسترسی به فایل رسانه‌ای بهبود یافته است

Storage Access Framework (SAF) به برنامه‌ها اجازه می‌دهد DocumentsProvider سفارشی را نمایش دهند که می‌تواند دسترسی به فایل‌ها در منبع داده را برای برنامه‌های دیگر فراهم کند. درواقع، ارائه‌دهنده اسناد حتی می‌تواند دسترسی به فایل‌هایی را که در فضای ذخیره‌سازی شبکه قرار دارند یا از پروتکلی مانند پروتکل انتقال رسانه (MTP) استفاده می‌کنند، فراهم کند.

بااین‌حال، دسترسی به فایل‌های رسانه‌ای بزرگ از منبع داده راه دور چالش‌هایی را به‌همراه دارد:

  • پخش‌کننده‌های رسانه به دسترسی قابل‌جستجو به فایل از ارائه‌دهنده اسناد نیاز دارند. در مواردی که فایل رسانه‌ای بزرگی در منبع داده راه دور قرار دارد، ارائه‌دهنده اسناد باید همه داده‌ها را ازقبل واکشی کند و توصیف‌گر فایل عکس آنی ایجاد کند. پخش‌کننده رسانه نمی‌تواند فایل را بدون توصیف‌گر فایل پخش کند، بنابراین بازپخش نمی‌تواند شروع شود تا زمانی که ارائه‌دهنده اسناد بارگیری فایل را تمام کند.
  • مدیران مجموعه رسانه، مانند برنامه‌های عکس، باید مجموعه‌ای از URIهای دسترسی را طی کنند تا به رسانه‌های ذخیره‌شده در کارت SD خارجی ازطریق پوشه‌های محدودشده دسترسی پیدا کنند. این الگوی دسترسی باعث می‌شود عملیات انبوه روی رسانه‌ها (مانند انتقال، کپی، و حذف) بسیار کند انجام شود.
  • مدیران مجموعه رسانه نمی‌توانند مکان سند را براساس شناسه منبع یکسان آن تعیین کنند. این امر باعث می‌شود این نوع برنامه‌ها نتوانند به‌راحتی به کاربران اجازه دهند محل ذخیره فایل رسانه را انتخاب کنند.

Android 8.0 با بهبود «چارچوب دسترسی به فضای ذخیره‌سازی» به هریک از این چالش‌ها رسیدگی می‌کند.

ارائه‌دهندگان سند سفارشی

از Android نسخه ۸.۰ به بعد، «چارچوب دسترسی به فضای ذخیره‌سازی» به ارائه‌دهندگان اسناد سفارشی اجازه می‌دهد توصیف‌گرهای فایل قابل‌جستجو برای فایل‌های موجود در منبع داده ازراه‌دور ایجاد کنند. SAF می‌تواند فایلی را باز کند تا توصیف‌گر فایل قابل‌جستجوی بومی را دریافت کند. سپس SAF درخواست‌های بایت گسسته را به ارائه‌دهنده اسناد ارسال می‌کند. این ویژگی به ارائه‌دهنده اسناد اجازه می‌دهد به‌جای ذخیره کردن کل فایل در حافظه نهان ازقبل، دقیقاً همان محدوده بایت‌هایی را که برنامه پخش‌کننده رسانه درخواست کرده است برگرداند.

برای استفاده از این ویژگی، باید روش جدید StorageManager.openProxyFileDescriptor() را فراخوانی کنید. روش openProxyFileDescriptor() شیء ProxyFileDescriptorCallback را به‌عنوان فراخوانی برگشتی می‌پذیرد. هرزمان که برنامه کارخواه عملیات فایل را روی توصیف‌گر فایل برگردانده‌شده از ارائه‌دهنده اسناد انجام دهد، SAF فراخوانی برگشتی را فراخوانی می‌کند.

دسترسی مستقیم به سند

از Android 8.0 (سطح API‏ ۲۶) به بعد، می‌توانید از روش getDocumentUri() برای دریافت URI که به همان سند mediaUri داده‌شده ارجاع می‌دهد استفاده کنید. بااین‌حال، چون شناسه منبع یکسان برگردانده‌شده توسط DocumentsProvider پشتیبانی می‌شود، مدیران مجموعه رسانه می‌توانند مستقیماً به سند دسترسی داشته باشند، بدون اینکه لازم باشد درخت‌های دایرکتوری‌های محدودشده را پیمایش کنند. درنتیجه، مدیران رسانه می‌توانند عملیات فایل را روی سند به‌طور قابل‌توجهی سریع‌تر انجام دهند.

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

مسیرهای اسناد

هنگام استفاده از Storage Access Framework در Android 8.0 (سطح API‏ ۲۶)، می‌توانید از روش findDocumentPath() که در هر دو کلاس DocumentsContract و DocumentsProvider دردسترس است، برای تعیین مسیر از ریشه سیستم فایل با شناسه سند داده‌شده استفاده کنید. این روش این مسیر را در شیء DocumentsContract.Path برمی‌گرداند. در مواردی که سیستم فایل چندین مسیر تعریف‌شده برای یک سند دارد، این روش مسیری را برمی‌گرداند که بیشتر برای رسیدن به سند با شناسه ارائه‌شده استفاده می‌شود.

این عملکرد به‌ویژه در سناریوهای زیر مفید است:

  • برنامه‌تان از کادر گفتگوی «ذخیره به‌عنوان» استفاده می‌کند که مکان سند خاصی را نمایش می‌دهد.
  • برنامه‌تان پوشه‌ها را در نمای نتایج جستجو نشان می‌دهد و اگر کاربر پوشه خاصی را انتخاب کند، باید اسناد فرزند موجود در آن پوشه را بار کند.

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

پایش بازپخش صوتی

سرویس سیستم AudioManager فهرستی از اشیاء فعال AudioPlaybackConfiguration را نگهداری می‌کند که هرکدام حاوی اطلاعاتی درباره جلسه بازپخش صوتی خاصی است. برنامه شما می‌تواند مجموعه پیکربندی‌های فعال فعلی را با فراخوانی getActivePlaybackConfigurations() بازیابی کند.

از Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶)، می‌توانید یک فراخوانی برگشتی ثبت کنید که وقتی یک یا چند شیء AudioPlaybackConfiguration تغییر می‌کند، به برنامه‌تان اطلاع دهد. برای انجام این کار، registerAudioPlaybackCallback() را فراخوانی کنید و نمونه‌ای از AudioManager.AudioPlaybackCallback را ارسال کنید. کلاس AudioManager.AudioPlaybackCallback حاوی متد onPlaybackConfigChanged() است که سیستم هنگام تغییر پیکربندی بازپخش صدا آن را فراخوانی می‌کند.

اتصال‌پذیری

Wi-Fi Aware

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) پشتیبانی از Wi-Fi Aware را اضافه می‌کند که براساس مشخصات «شبکه اتصال مجاورتی» (NAN) است. در دستگاه‌های دارای سخت‌افزار مناسب Wi-Fi Aware، برنامه‌ها و دستگاه‌های اطراف می‌توانند ازطریق Wi-Fi بدون نقطه دسترسی به اینترنت، یکدیگر را کاوش کنند و باهم ارتباط برقرار کنند. ما درحال همکاری با شرکای سخت‌افزاری خود هستیم تا فناوری Wi-Fi Aware را در اسرع وقت به دستگاه‌ها بیاوریم. برای کسب اطلاعات درباره نحوه ادغام Wi-Fi Aware در برنامه‌تان، به Wi-Fi Aware مراجعه کنید.

بلوتوث

‫Android نسخه ۸.۰ (سطح میانای برنامه‌سازی کاربردی ۲۶) با افزودن ویژگی‌های زیر، پشتیبانی پلاتفرم از بلوتوث را غنی‌تر می‌کند:

  • پشتیبانی از استاندارد AVRCP 1.4 که مرور کتابخانه آهنگ را ممکن می‌کند.
  • پشتیبانی از استاندارد Bluetooth Low-Energy (BLE) 5.0.
  • ادغام کدک Sony LDAC در پشته بلوتوث.

جفت‌سازی دستگاه همپا

Android 8.0 (سطح ای‌پی‌آی ۲۶) میاناهای برنامه‌سازی کاربردی‌ای ارائه می‌دهد که به شما امکان می‌دهد هنگام تلاش برای جفت کردن با دستگاه‌های همپا ازطریق بلوتوث، BLE، و Wi-Fi، کادر گفتگوی درخواست جفت‌سازی را سفارشی‌سازی کنید. برای اطلاعات بیشتر، به جفت‌سازی دستگاه همپا مراجعه کنید.

برای اطلاعات بیشتر درباره استفاده از بلوتوث در Android، به راهنمای بلوتوث مراجعه کنید. برای تغییرات بلوتوث که مختص Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) است، به بخش بلوتوث در صفحه تغییرات رفتاری Android 8.0 مراجعه کنید.

هم‌رسانی

هم‌رسانی هوشمند

‫Android نسخه ۸.۰ (سطح API‏ ۲۶) درباره اولویت‌های هم‌رسانی شخصی‌سازی‌شده کاربران اطلاعات کسب می‌کند و برای هر نوع محتوا بهتر درک می‌کند که کدام برنامه‌ها برای هم‌رسانی مناسب هستند. برای مثال، اگر کاربر از رسیدی عکس بگیرد، Android نسخه ۸.۰ می‌تواند برنامه ردیابی هزینه را پیشنهاد دهد؛ اگر کاربر سلفی بگیرد، برنامه رسانه‌های اجتماعی می‌تواند تصویر را بهتر مدیریت کند. ‫Android 8.0 به‌طور خودکار همه این الگوها را براساس اولویت‌های شخصی‌سازی‌شده کاربران یاد می‌گیرد.

«هم‌رسانی هوشمند» برای انواع محتوا به‌غیراز image کار می‌کند، مثل audio،‏ video،‏ text،‏ URL، و غیره.

برای فعال کردن «هم‌رسانی هوشمند»، حداکثر سه گزارمان رشته‌ای ArrayList به قصدی که محتوا را هم‌رسانی می‌کند اضافه کنید. حاشیه‌نویسی‌ها باید مؤلفه‌ها یا موضوعات اصلی محتوا را توصیف کنند. نمونه کد زیر نحوه افزودن حاشیه‌نویسی به هدف را نشان می‌دهد:

کاتلین

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

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

جاوا

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

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

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

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

طبقه‌بندی‌کننده نوشتار

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

دسترس‌پذیری

Android 8.0 (سطح API‏ ۲۶) از چندین ویژگی دسترس‌پذیری جدید برای توسعه‌دهندگانی که سرویس‌های دسترس‌پذیری خودشان را ایجاد می‌کنند پشتیبانی می‌کند:

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

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

اجازه‌ها

Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) چندین اجازه جدید مرتبط با تلفن را معرفی می‌کند:

  • اجازه ANSWER_PHONE_CALLS به برنامه شما امکان می‌دهد به تماس‌های تلفنی ورودی به‌صورت برنامه‌نویسی‌شده پاسخ دهد. برای مدیریت تماس تلفنی ورودی در برنامه‌تان، می‌توانید از روش acceptRingingCall() استفاده کنید.
  • اجازه READ_PHONE_NUMBERS به برنامه شما امکان می‌دهد به شماره تلفن‌های ذخیره‌شده در دستگاه دسترسی خواندن داشته باشد.

هر دوی این اجازه‌ها به‌عنوان خطرناک طبقه‌بندی شده‌اند و هر دو بخشی از گروه اجازه PHONE هستند.

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

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

در نسخه‌های قبلی Android، برنامه‌هایی که می‌خواستند فهرست حساب‌های کاربری را ردیابی کنند باید به‌روزرسانی‌های مربوط به همه حساب‌ها را دریافت می‌کردند، ازجمله حساب‌هایی با انواع نامرتبط. Android 8.0 روش addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) را اضافه می‌کند که به برنامه‌ها اجازه می‌دهد فهرستی از انواع حساب را مشخص کنند که تغییرات حساب باید برای آن‌ها دریافت شود.

تغییرات میانای برنامه‌سازی کاربردی

‫AccountManager شش روش جدید ارائه می‌دهد تا به اصالت‌سنج‌ها کمک کند مدیریت کنند کدام برنامه‌ها می‌توانند حساب را ببینند:

Android 8.0 (سطح API‏ ۲۶) دو مقدار ویژه «نام بسته» را برای مشخص کردن سطوح رؤیت‌پذیری برای برنامه‌هایی که بااستفاده از روش 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 نسخه ۸.۰ (سطح میانای برنامه‌سازی کاربردی ۲۶) موارد پشتیبانی اضافی زیر را برای آزمایش‌های ابزار دقیق برنامه‌تان ارائه می‌دهد.

اجرا دربرابر فرایندهای برنامه غیرپیش‌فرض

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

برای تعریف ابزار دقیق فرایند غیرپیش‌فرض، به فایل مانیفست خود بروید، سپس به عنصر <instrumentation> موردنظر بروید. مشخصه android:targetProcess را اضافه کنید و مقدار آن را روی یکی از موارد زیر تنظیم کنید:

  • نام فرایندی خاص.
  • فهرست جداشده با کاما از نام‌های فرایند.
  • یک نویسه عام ("*") که به ابزار دقیق اجازه می‌دهد در مقابل هر فرایند راه‌اندازی‌شده‌ای که کد را در بسته مشخص‌شده در ویژگی android:targetPackage اجرا می‌کند، اجرا شود.

درحالی‌که آزمایش ابزار شما درحال اجرا است، می‌توانید با فراخوانی getProcessName() بررسی کنید که کدام فرایند را آزمایش می‌کند.

گزارش کردن نتایج درطول آزمایش

اکنون می‌توانید نتایج را درحین اجرای آزمایش ابزار دقیق گزارش کنید، نه بعداز آن، با تماس با addResults().

قصد شبیه‌سازی‌شده برای آزمایش‌ها

برای آسان‌تر کردن ایجاد آزمایش‌های واسط کاربر مستقل و مجزا برای فعالیت‌های برنامه‌تان، Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) روش onStartActivity() را معرفی می‌کند. این روش را در زیرکلاس سفارشی از کلاس Instrumentation.ActivityMonitor لغو می‌کنید تا هدف خاصی را که کلاس آزمایشی شما فراخوانی می‌کند مدیریت کنید.

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

زمان اجرا و ابزارها

بهینه‌سازی‌های پلاتفرم

‫Android 8.0 (سطح API‏ ۲۶) بهینه‌سازی‌های زمان اجرا و بهینه‌سازی‌های دیگری را به پلاتفرم اضافه می‌کند که منجر به بهبود عملکرد می‌شود. این بهینه‌سازی‌ها شامل جمع‌آوری زباله فشرده‌سازی هم‌زمان، استفاده کارآمدتر از حافظه، و محلی‌سازی کد است.

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

پشتیبانی از زبان جاوا به‌روز شد

‫Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) پشتیبانی از چند میانای برنامه‌سازی کاربردی OpenJDK Java دیگر را اضافه می‌کند:

برای کسب اطلاعات بیشتر درباره کلاس‌ها و روش‌های موجود در این بسته‌های جدیداً اضافه‌شده، به سند مرجع API مراجعه کنید.

اگر می‌خواهید از ویژگی‌های زبان Java 8 در Android Studio استفاده کنید، باید جدیدترین نسخه پیش‌نمایش را بارگیری کنید.

میاناهای برنامه‌سازی کاربردی چارچوب Android ICU4J به‌روزرسانی‌شده

Android 8.0 (سطح API‏ ۲۶) میاناهای برنامه‌سازی کاربردی چارچوب ICU4J Android را گسترش می‌دهد (که زیرمجموعه‌ای از میاناهای برنامه‌سازی کاربردی ICU4J است) تا توسعه‌دهندگان نرم‌افزار بتوانند تحت بسته android.icu از آن استفاده کنند. این میاناهای برنامه‌سازی کاربردی از داده‌های بومی‌سازی موجود در دستگاه استفاده می‌کنند، بنابراین می‌توانید با کامپایل نکردن کتابخانه‌های ICU4J در APK، ردپای APK خود را کاهش دهید.

جدول ۱. نسخه‌های ICU،‏ CLDR، و Unicode استفاده‌شده در Android.

سطح ای‌پی‌آی Android نسخه ICU نسخه CLDR نسخه یونیکد
Android 7.0 (سطح ای‌پی‌آی ۲۴)، Android 7.1 (سطح ای‌پی‌آی ۲۵) 56 28 ۸.۰
Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) ۵۸٫۲ ‫۳۰.۰.۳ ۹٫۰

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

Android enterprise

ویژگی‌های سازمانی و میاناهای برنامه‌سازی کاربردی جدیدی برای دستگاه‌های دارای Android 8.0 (سطح میانای برنامه‌سازی کاربردی ۲۶) معرفی شده است. نکات برجسته شامل موارد زیر است:

  • نمایه‌های کاری در دستگاه‌های کاملاً مدیریت‌شده به شرکت‌ها امکان می‌دهد داده‌های کاری را از داده‌های شخصی جدا کنند و درعین‌حال هر دو را مدیریت کنند.
  • واگذاری API به مالکان دستگاه و مالکان نمایه اجازه می‌دهد مدیریت برنامه را به برنامه‌های دیگر واگذار کنند.
  • بهبود تجربه کاربری در جریان تدارک (ازجمله گزینه‌های سفارشی‌سازی جدید) زمان راه‌اندازی را کاهش می‌دهد.
  • کنترل‌های جدید روی بلوتوث، Wi-Fi، پشتیبان‌گیری، و امنیت به شرکت‌ها اجازه می‌دهد بخش بیشتری از دستگاه را مدیریت کنند. گزارش فعالیت شبکه به شرکت‌ها کمک می‌کند مشکلات را ردیابی کنند.

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