میاناهای برنامه‌سازی کاربردی Android 4.2

سطح ای‌پی‌آی: ۱۷

‫Android 4.2 (JELLY_BEAN_MR1) به‌روزرسانی‌ای برای نسخه Jelly Bean است که ویژگی‌های جدیدی را برای کاربران و توسعه‌دهندگان نرم‌افزار ارائه می‌دهد. این سند مقدمه‌ای بر قابل‌توجه‌ترین و مفیدترین میاناهای برنامه‌سازی کاربردی جدید برای توسعه‌دهندگان ارائه می‌دهد.

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

برای بهینه‌سازی بهتر برنامه‌تان برای دستگاه‌های دارای Android 4.2، باید targetSdkVersion را روی "17" تنظیم کنید، آن را روی تصویر سیستم Android 4.2 نصب کنید، آن را آزمایش کنید، سپس به‌روزرسانی‌ای با این تغییر منتشر کنید.

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

اطلاعات بیشتر درباره نحوه عملکرد سطوح API در سطح API چیست؟ دردسترس است.

تغییرات مهم در رفتار

اگر قبلاً برنامه‌ای برای Android منتشر کرده‌اید، از تغییرات زیر که ممکن است بر عملکرد برنامه‌تان تأثیر بگذارد آگاه باشید:

  • ارائه‌دهندگان محتوا دیگر به‌طور پیش‌فرض صادر نمی‌شوند. یعنی مقدار پیش‌فرض برای مشخصه android:exported اکنون “false" است. اگر مهم است که برنامه‌های دیگر بتوانند به ارائه‌دهنده محتوای شما دسترسی داشته باشند، اکنون باید android:exported="true" را به‌طور صریح تنظیم کنید.

    این تغییر فقط درصورتی اعمال می‌شود که android:targetSdkVersion یا android:minSdkVersion را روی ۱۷ یا بالاتر تنظیم کنید. درغیراین‌صورت، مقدار پیش‌فرض همچنان “true" است حتی وقتی در Android نسخه ۴.۲ و بالاتر اجرا شود.

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

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

  • برخی‌از تنظیمات دستگاه تعریف‌شده توسط Settings.System اکنون فقط خواندنی هستند. اگر برنامه شما تلاش کند تغییراتی را در تنظیمات تعریف‌شده در Settings.System که به Settings.Global منتقل شده است بنویسد، عمل نوشتن هنگام اجرا در Android 4.2 و نسخه‌های بالاتر به‌طور بی‌صدا ناموفق خواهد بود.

    حتی اگر مقدار android:targetSdkVersion و android:minSdkVersion شما کمتر از ۱۷ باشد، برنامه شما هنگام اجرا در Android 4.2 و نسخه‌های بالاتر نمی‌تواند تنظیماتی را که به Settings.Global منتقل شده‌اند تغییر دهد.

  • اگر برنامه‌تان از WebView استفاده می‌کند، Android 4.2 لایه امنیتی دیگری اضافه می‌کند تا بتوانید با ایمنی بیشتری جاوا اسکریپت را به کد Android خود پیوند دهید. اگر targetSdkVersion را روی ۱۷ یا بالاتر تنظیم کنید، اکنون باید حاشیه‌نویسی @JavascriptInterface را به هر روشی که می‌خواهید برای JavaScript دردسترس باشد اضافه کنید (روش باید عمومی هم باشد). اگر حاشیه‌نویسی را ارائه نکنید، وقتی روش در Android 4.2 یا بالاتر اجرا می‌شود، صفحه وب در WebView به آن دسترسی ندارد. اگر targetSdkVersion را روی ۱۶ یا کمتر تنظیم کنید، حاشیه‌نویسی لازم نیست، اما توصیه می‌کنیم نسخه هدف را به‌روز کنید و حاشیه‌نویسی را برای امنیت بیشتر اضافه کنید.

    درباره اتصال کد جاوا اسکریپت به کد Android بیشتر بخوانید.

Daydream

Daydream حالت محافظ صفحه‌نمایش تعاملی جدیدی برای دستگاه‌های Android است. وقتی دستگاه در پایه قرار داده می‌شود یا وقتی دستگاه درحالی‌که به شارژر متصل است بدون استفاده رها می‌شود، این حالت به‌طور خودکار فعال می‌شود (به‌جای اینکه صفحه‌نمایش خاموش شود). Daydream در هر زمان یک رؤیا را نمایش می‌دهد که ممکن است نمایش کاملاً بصری و غیرفعالی باشد که با لمس کردن بسته می‌شود، یا ممکن است تعاملی باشد و به مجموعه کامل رویدادهای ورودی پاسخ دهد. رؤیاهایتان در فرایند برنامه‌تان اجرا می‌شوند و دسترسی کامل به جعبه‌ابزار میانای کاربری Android دارند، ازجمله نماها، طرح‌بندی‌ها، و پویانمایی‌ها، بنابراین انعطاف‌پذیرتر و قدرتمندتر از کاغذدیواری‌های پویا یا ابزارک‌های برنامه هستند.

با پیاده‌سازی زیرکلاسی از DreamService می‌توانید برای Daydream رؤیا ایجاد کنید. میاناهای برنامه‌سازی کاربردی DreamService طراحی شده‌اند تا شبیه به میاناهای Activity باشند. برای مشخص کردن واسط کاربر برای رویایتان، شناسه منبع چیدمان یا View را در هر زمانی پس‌از داشتن پنجره به setContentView() ارسال کنید، مثلاً از onAttachedToWindow() بازخوان.

کلاس DreamService علاوه‌بر میاناهای برنامه‌سازی کاربردی پایه Service، روش‌های فراخوانی چرخه حیات مهم دیگری را نیز ارائه می‌دهد، مانند onDreamingStarted()،‏ onDreamingStopped()، و onDetachedFromWindow(). نمی‌توانید DreamService را از برنامه خودتان شروع کنید—سیستم آن را به‌طور خودکار راه‌اندازی می‌کند.

اگر رؤیایتان تعاملی است، می‌توانید فعالیتی را از رؤیا شروع کنید تا کاربر را برای جزئیات بیشتر یا کنترل به میانای کاربری کامل برنامه‌تان بفرستید. می‌توانید از finish() برای پایان دادن به رؤیا استفاده کنید تا کاربر بتواند «فعالیت» جدید را ببیند.

برای دردسترس قرار دادن رؤیای روزانه در سیستم، DreamService خود را با عنصر <service> در فایل مانیفست اعلام کنید. سپس باید فیلتر هدفی با کنش "android.service.dreams.DreamService" اضافه کنید. برای مثال:

<service android:name=".MyDream" android:exported="true"
    android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

چند روش مفید دیگر در DreamService وجود دارد که باید از آن‌ها آگاه باشید:

  • setInteractive(boolean) کنترل می‌کند که آیا رؤیا رویدادهای ورودی دریافت می‌کند یا بلافاصله پس‌از ورودی کاربر از آن خارج می‌شود. اگر رؤیا تعاملی باشد، کاربر می‌تواند از دکمه‌های برگشت یا صفحه اصلی برای خروج از رؤیا استفاده کند یا می‌توانید برای توقف رؤیا، finish() را فراخوانی کنید.
  • اگر می‌خواهید نمایشگر کاملاً فراگیر باشد، می‌توانید با setFullscreen() تماس بگیرید تا نوار وضعیت پنهان شود.
  • قبل‌از شروع «خیال‌پردازی»، نمایشگر کم‌نور می‌شود تا به کاربر اطلاع دهد که زمان اتمام حالت آزاد نزدیک است. با فراخوانی setScreenBright(true) می‌توانید روشنایی نمایشگر را روی حالت معمول تنظیم کنید.

برای اطلاعات بیشتر، به اسناد DreamService مراجعه کنید.

نمایشگرهای ثانویه

‫Android اکنون به برنامه شما اجازه می‌دهد محتوای منحصربه‌فردی را در صفحه‌نمایش‌های اضافی که ازطریق اتصال سیمی یا Wi-Fi به دستگاه کاربر متصل شده‌اند نمایش دهد. برای ایجاد محتوای منحصربه‌فرد برای نمایشگر دوم، کلاس Presentation را گسترش دهید و onCreate() را پیاده‌سازی کنید. در onCreate()، واسط کاربرتان را برای نمایشگر ثانویه با فراخوانی setContentView() مشخص کنید. به‌عنوان افزونه‌ای از کلاس Dialog، کلاس Presentation منطقه‌ای را ارائه می‌دهد که برنامه‌تان می‌تواند واسط کاربر منحصربه‌فردی را در نمایشگر ثانویه نمایش دهد.

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

برای دریافت نمایشگر پیش‌فرض برای ارائه‌تان، با MediaRouter.getSelectedRoute() تماس بگیرید و آن را ROUTE_TYPE_LIVE_VIDEO ارسال کنید. این کار یک شیء MediaRouter.RouteInfo را برمی‌گرداند که مسیر انتخاب‌شده فعلی سیستم را برای ارائه‌های ویدیویی توصیف می‌کند. اگر MediaRouter.RouteInfo تهی نیست، getPresentationDisplay() را فراخوانی کنید تا Display نمایشگر متصل‌شده را دریافت کنید.

سپس می‌توانید با ارسال شیء Display به سازنده کلاس Presentation، ارائه‌تان را نمایش دهید. ارائه شما اکنون در نمایشگر ثانویه نشان داده می‌شود.

برای شناسایی زمان اتصال نمایشگر جدید در زمان اجرا، نمونه‌ای از MediaRouter.SimpleCallback ایجاد کنید که در آن روش فراخوانی برگشتی onRoutePresentationDisplayChanged() را پیاده‌سازی کنید، که سیستم هنگام اتصال نمایشگر ارائه جدید آن را فراخوانی می‌کند. سپس MediaRouter.SimpleCallback را با تحویل آن به MediaRouter.addCallback() به‌همراه نوع مسیر ROUTE_TYPE_LIVE_VIDEO ثبت کنید. وقتی تماسی به onRoutePresentationDisplayChanged() دریافت می‌کنید، کافی است همان‌طور که در بالا ذکر شد با MediaRouter.getSelectedRoute() تماس بگیرید.

برای بهینه‌سازی بیشتر میانای کاربری در Presentation برای صفحه‌های دوم، می‌توانید با مشخص کردن مشخصه android:presentationTheme در <style> که برای برنامه یا فعالیتتان اعمال کرده‌اید، موضوع متفاوتی را اعمال کنید.

به‌خاطر داشته باشید که صفحه‌نمایش‌های متصل به دستگاه کاربر اغلب اندازه بزرگ‌تری دارند و احتمالاً تراکم صفحه‌نمایش آن‌ها متفاوت است. چون ویژگی‌های صفحه‌نمایش ممکن است متفاوت باشد، باید منابعی ارائه دهید که به‌طور خاص برای این نمایشگرهای بزرگ‌تر بهینه‌سازی شده باشند. اگر نیاز دارید از Presentation خود منابع بیشتری درخواست کنید، با getContext().getResources() تماس بگیرید تا شیء Resources مربوط به نمایشگر را دریافت کنید. این کار منابع مناسب را از برنامه‌تان که برای اندازه و تراکم صفحه‌نمایش ثانویه مناسب‌تر است ارائه می‌دهد.

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

ابزاره‌های صفحه قفل

‫Android اکنون به کاربران امکان می‌دهد ابزاره‌های برنامه را به صفحه قفل اضافه کنند. برای اینکه ابزاره برنامه شما برای استفاده در صفحه قفل دردسترس باشد، مشخصه android:widgetCategory را به فایل XML خود که AppWidgetProviderInfo را مشخص می‌کند اضافه کنید. این مشخصه از دو مقدار پشتیبانی می‌کند: home_screen و keyguard. به‌طور پیش‌فرض، این مشخصه روی home_screen تنظیم شده است تا کاربران بتوانند ابزاره برنامه شما را به «صفحه اصلی» اضافه کنند. اگر می‌خواهید ابزاره برنامه‌تان در صفحه قفل نیز دردسترس باشد، مقدار keyguard را اضافه کنید:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:widgetCategory="keyguard|home_screen">
</appwidget-provider>

همچنین باید چیدمان اولیه‌ای برای ابزاره برنامه خود در صفحه قفل با ویژگی android:initialKeyguardLayout مشخص کنید. این روش مانند android:initialLayout عمل می‌کند، به این صورت که چیدمانی را ارائه می‌دهد که می‌تواند بلافاصله ظاهر شود تا زمانی که ابزاره برنامه شما مقداردهی اولیه شود و بتواند چیدمان را به‌روز کند.

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

چند کاربر

اکنون Android امکان ایجاد چندین فضای کاربر در دستگاه‌های قابل‌اشتراک‌گذاری مثل رایانه‌های لوحی را فراهم کرده است. هر کاربر در یک دستگاه مجموعه حساب‌ها، برنامه‌ها، تنظیمات سیستم، فایل‌ها، و هرگونه داده مرتبط با کاربر دیگری را دارد.

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

ذخیره داده‌ها در محیط چندکاربری

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

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

مهم نیست از کدام‌یک از این میاناهای برنامه‌سازی کاربردی برای ذخیره کردن داده‌های کاربر خاصی استفاده می‌کنید، داده‌ها هنگام اجرا به‌عنوان کاربر دیگری دردسترس نخواهد بود. از دیدگاه برنامه‌تان، هر کاربر در دستگاهی کاملاً جداگانه درحال اجرا است.

شناسایی کاربران در محیط چندکاربره

اگر برنامه‌تان می‌خواهد کاربران منحصربه‌فرد را شناسایی کند، مثلاً برای جمع‌آوری تجزیه‌وتحلیل یا ایجاد سایر ارتباطات حساب، باید از روش‌های توصیه‌شده برای شناسایی نصب‌های منحصربه‌فرد پیروی کنید. با ایجاد UUID جدید هنگام اولین راه‌اندازی برنامه‌تان، مطمئن می‌شوید که شناسه یکتایی برای ردیابی هر کاربر دریافت می‌کنید، صرف‌نظر از اینکه چند کاربر برنامه‌تان را در یک دستگاه نصب کرده باشند. یا می‌توانید نشان محلی را که از سرورتان واکشی شده است ذخیره کنید یا از شناسه ثبت ارائه‌شده توسط Google Cloud Messaging استفاده کنید.

توجه داشته باشید که اگر برنامه‌تان یکی از شناسه‌های دستگاه سخت‌افزاری (مانند نشانی MAC‏ WiFi یا شماره SERIAL) را درخواست کند، این شناسه‌ها برای هر کاربر مقدار یکسانی را ارائه خواهند داد زیرا این شناسه‌ها به سخت‌افزار مرتبط هستند و نه به کاربر. به‌علاوه، مشکلات دیگری که این شناسه‌ها ایجاد می‌کنند در پست وبلاگ شناسایی نصب‌های برنامه مورد بحث قرار گرفته است.

تنظیمات سراسری جدید

تنظیمات سیستم با افزودن Settings.Global به‌روز شده است تا از چند کاربر پشتیبانی کند. این مجموعه تنظیمات مشابه تنظیمات Settings.Secure است زیرا فقط خواندنی است، اما در همه فضاهای کاربر در دستگاه به‌صورت جهانی اعمال می‌شود.

چند تنظیم موجود از Settings.System یا Settings.Secure به اینجا منتقل شده است. اگر برنامه شما درحال‌حاضر درحال ایجاد تغییر در تنظیماتی است که قبلاً در Settings.System تعریف شده است (مثلاً AIRPLANE_MODE_ON)، باید انتظار داشته باشید که انجام این کار دیگر در دستگاهی که Android 4.2 یا بالاتر را اجرا می‌کند کار نخواهد کرد، اگر آن تنظیمات به Settings.Global منتقل شده باشند. می‌توانید به خواندن تنظیماتی که در Settings.Global هستند ادامه دهید، اما چون این تنظیمات دیگر برای تغییر دادن توسط برنامه‌ها ایمن درنظر گرفته نمی‌شوند، تلاش برای انجام این کار بدون اطلاع‌رسانی ناموفق خواهد بود و سیستم هنگام اجرای برنامه شما در Android نسخه ۴.۲ یا بالاتر، هشداری در گزارش سیستم می‌نویسد.

پشتیبانی از چیدمان راست‌به‌چپ

‫Android اکنون چندین API ارائه می‌دهد که به شما امکان می‌دهد واسط‌های کاربری بسازید که به‌طور مناسب جهت چیدمان را برای پشتیبانی از زبان‌هایی که از واسط‌های کاربر راست‌به‌چپ (RTL) و جهت خواندن استفاده می‌کنند، مانند عربی و عبری، تغییر دهند.

برای شروع پشتیبانی از چیدمان‌های راست‌به‌چپ در برنامه‌تان، مشخصه android:supportsRtl را برای عنصر <application> در فایل مانیفست خود تنظیم کنید و آن را روی “true" قرار دهید. پس‌از فعال کردن این تنظیم، سیستم میاناهای برنامه‌سازی کاربردی مختلف راست‌به‌چپ را فعال می‌کند تا برنامه‌تان را با چیدمان راست‌به‌چپ نمایش دهد. برای مثال، نوار اقدام نماد و عنوان را در سمت چپ و دکمه‌های اقدام را در سمت راست نشان خواهد داد، و هر چیدمانی که با کلاس‌های View ارائه‌شده توسط چارچوب ایجاد کرده‌اید نیز معکوس خواهد شد.

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

  1. تبدیل ویژگی‌های چیدمان چپ‌محور و راست‌محور به ویژگی‌های چیدمان آغازمحور و پایان‌محور.

    برای مثال، از android:layout_marginStart به‌جای android:layout_marginLeft و از android:layout_marginEnd به‌جای android:layout_marginRight استفاده کنید.

    کلاس RelativeLayout همچنین مشخصه‌های چیدمان متناظر را برای جایگزینی موقعیت‌های چپ/راست ارائه می‌دهد، مانند android:layout_alignParentStart برای جایگزینی android:layout_alignParentLeft و android:layout_toStartOf به‌جای android:layout_toLeftOf.

  2. یا برای ارائه بهینه‌سازی کامل برای چیدمان‌های راست‌به‌چپ، می‌توانید فایل‌های چیدمان کاملاً جداگانه‌ای بااستفاده از مشخص‌کننده منبع ldrtl ارائه دهید (ldrtl مخفف چیدمان-جهت-راست-به-چپ است). برای مثال، می‌توانید فایل‌های چیدمان پیش‌فرض را در res/layout/ و چیدمان‌های بهینه‌شده برای راست‌به‌چپ را در res/layout-ldrtl/ ذخیره کنید.

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

میاناهای برنامه‌سازی کاربردی مختلف دیگری در سراسر چارچوب برای پشتیبانی از چیدمان‌های راست‌به‌چپ دردسترس است، مثلاً در کلاس View تا بتوانید رفتارهای مناسب را برای نماهای سفارشی پیاده‌سازی کنید و در Configuration برای پُرسمان جهت چیدمان فعلی.

توجه: اگر از SQlite استفاده می‌کنید و نام جدول‌ها یا ستون‌هایتان «فقط عدد» است، مراقب باشید: استفاده از String.format(String, Object...) می‌تواند منجر به خطاهایی شود که در آن اعداد به معادل‌های عربی‌شان تبدیل شده‌اند، اگر دستگاهتان روی منطقه زبانی عربی تنظیم شده باشد. باید از String.format(Locale,String,Object...) استفاده کنید تا مطمئن شوید اعداد به‌صورت ASCII حفظ می‌شوند. همچنین برای قالب‌بندی اعداد، به‌جای String.valueOf(int) از String.format("%d", int) استفاده کنید.

بخش‌های تودرتو

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

برای تودرتو کردن قطعه، کافی است getChildFragmentManager() را در Fragment که می‌خواهید قطعه را به آن اضافه کنید فراخوانی کنید. این تابع FragmentManager را برمی‌گرداند که می‌توانید مانند فعالیت سطح بالا از آن برای ایجاد تراکنش‌های قطعه استفاده کنید. برای مثال، در اینجا کدی وجود دارد که قطعه‌ای را از داخل کلاس Fragment موجود اضافه می‌کند:

کاتلین

val videoFragment = VideoPlayerFragment()
childFragmentManager.beginTransaction().apply {
    add(R.id.video_fragment, videoFragment)
    commit()
}

جاوا

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

از درون یک تکه‌برگ تودرتو، می‌توانید با فراخوانی getParentFragment()، مرجعی برای تکه‌برگ والد دریافت کنید.

«کتابخانه پشتیبانی Android» اکنون از قطعه‌های تودرتو نیز پشتیبانی می‌کند، بنابراین می‌توانید طراحی‌های قطعه تودرتو را در Android 1.6 و بالاتر پیاده‌سازی کنید.

توجه: وقتی چیدمانی شامل <fragment> باشد، نمی‌توانید آن چیدمان را در یک قطعه ازهم باز کنید. تکه‌کدهای تودرتو فقط زمانی پشتیبانی می‌شوند که به‌صورت پویا به یک تکه‌کد اضافه شوند.

Renderscript

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

ویژگی‌های ذاتی دستورگان

می‌توانید از دستورات داخلی Renderscript استفاده کنید که عملیات رایج را برای شما پیاده‌سازی می‌کنند، مثل:

برای استفاده از یک اسکریپت ذاتی، روش create() ایستا هر ذاتی را فراخوانی کنید تا نمونه‌ای از اسکریپت ایجاد کنید. سپس، روش‌های set() دردسترس هر دستورگان ذاتی را فرا می‌خوانید تا ورودی‌ها و گزینه‌های لازم را تنظیم کنید. درنهایت، روش forEach() را برای اجرای دستورگان فراخوانی کنید.

گروه‌های نوشتار

‫ScriptGroups به شما امکان می‌دهد اسکریپت‌های Renderscript مرتبط را به هم زنجیر کنید و آن‌ها را با یک تماس اجرا کنید.

از ScriptGroup.Builder برای افزودن همه اسکریپت‌ها به گروه با فراخوانی addKernel() استفاده کنید. وقتی همه اسکریپت‌ها را اضافه کردید، با فراخوانی addConnection()، بین اسکریپت‌ها اتصال ایجاد کنید. وقتی افزودن اتصالات تمام شد، create() را فراخوانی کنید تا گروه اسکریپت ایجاد شود. پیش‌از اجرای گروه نوشتار، ورودی Allocation و نوشتار اولیه را برای اجرا با روش setInput(Script.KernelID, Allocation) مشخص کنید و برونداد Allocation را که نتیجه در آن نوشته خواهد شد و نوشتار نهایی را برای اجرا با setOutput() ارائه دهید. درنهایت، برای اجرای گروه نوشتار، execute() را فراخوانی کنید.

Filterscript

‫Filterscript محدودیت‌هایی را برای «میاناهای برنامه‌نویسی کاربردی» موجود در Renderscript تعریف می‌کند که به کد حاصل اجازه می‌دهد در انواع بیشتری از پردازنده‌ها (CPU،‏ GPU، و DSP) اجرا شود. برای ایجاد فایل‌های Filterscript، به‌جای فایل‌های .rs، فایل‌های .fs ایجاد کنید و #pragma rs_fp_relaxed را مشخص کنید تا به زمان اجرای Renderscript بگویید که اسکریپت‌های شما به دقت ممیز شناور IEEE 754-2008 دقیق نیاز ندارند. این دقت امکان صفر کردن اعداد غیرعادی و گرد کردن به‌سمت صفر را فراهم می‌کند. علاوه‌براین، اسکریپت‌های Filterscript شما نباید از انواع توکار ۳۲ بیتی استفاده کنند و باید بااستفاده از مشخصه __attribute__((kernel))، تابع ریشه سفارشی را مشخص کنند، زیرا Filterscript از اشاره‌گرها که امضای پیش‌فرض تابع root() تعریف می‌کند پشتیبانی نمی‌کند.

توجه: اگرچه پشتیبانی از Filterscript در پلاتفرم وجود دارد، پشتیبانی توسعه‌دهنده در «ابزارهای کیت توسعه نرم‌افزار» نسخه ۲۱.۰.۱ دردسترس خواهد بود.

برای مشاهده جزئیات همه تغییرات میانای برنامه‌سازی کاربردی در Android 4.2، گزارش تفاوت‌های میانای برنامه‌سازی کاربردی را ببینید.