سطح API: 16
Android 4.1 ( JELLY_BEAN
) پیشرفتی از پلتفرم است که عملکرد بهبود یافته و تجربه کاربری بهبود یافته را ارائه می دهد. ویژگی های جدیدی را برای کاربران و توسعه دهندگان برنامه اضافه می کند. این سند مقدمه ای بر قابل توجه ترین و مفیدترین APIهای جدید برای توسعه دهندگان برنامه ارائه می دهد.
بهعنوان یک توسعهدهنده برنامه، Android 4.1 از طریق SDK Manager بهعنوان یک تصویر سیستمی که میتوانید در شبیهساز Android و یک پلتفرم SDK اجرا کنید، در دسترس شما است که میتوانید برنامه خود را بر اساس آن بسازید. برای ساخت و تست برنامه خود در اندروید 4.1 باید هر چه سریعتر تصویر سیستم و پلتفرم را دانلود کنید.
برای بهینهسازی بهتر برنامه خود برای دستگاههای دارای Android 4.1، باید targetSdkVersion
خود را روی "16"
تنظیم کنید، آن را روی تصویر سیستم Android 4.1 نصب کنید، آن را آزمایش کنید، سپس با این تغییر بهروزرسانی منتشر کنید.
میتوانید از APIها در Android 4.1 استفاده کنید و در عین حال از نسخههای قدیمیتر نیز با اضافه کردن شرایطی به کد خود استفاده کنید که سطح API سیستم را قبل از اجرای APIهایی که توسط minSdkVersion
شما پشتیبانی نمیشوند بررسی میکنند. برای کسب اطلاعات بیشتر در مورد حفظ سازگاری با عقب، ایجاد UI های سازگار با عقب را بخوانید.
اطلاعات بیشتر در مورد نحوه عملکرد سطوح API در سطح API چیست؟
اجزای برنامه
خدمات ایزوله
با مشخص کردن android:isolatedProcess="true"
در تگ <service>
، Service
شما تحت فرآیند شناسه کاربر مجزای خود اجرا می شود که هیچ مجوزی ندارد.
مدیریت حافظه
ثابت های جدید ComponentCallbacks2
مانند TRIM_MEMORY_RUNNING_LOW
و TRIM_MEMORY_RUNNING_CRITICAL
اطلاعات بیشتری را در مورد وضعیت حافظه به پردازش های پیش زمینه ارائه می دهند، قبل از اینکه سیستم با onLowMemory()
تماس بگیرد.
متد جدید getMyMemoryState(ActivityManager.RunningAppProcessInfo)
به شما امکان می دهد وضعیت کلی حافظه را بازیابی کنید.
ارائه دهندگان محتوا
یک روش جدید، acquireUnstableContentProviderClient()
، به شما امکان می دهد به یک ContentProviderClient
دسترسی پیدا کنید که ممکن است "ناپایدار" باشد به طوری که اگر ارائه دهنده محتوا این کار را انجام دهد، برنامه شما خراب نمی شود. هنگامی که با ارائه دهندگان محتوا در یک برنامه جداگانه در تعامل هستید مفید است.
تصاویر پس زمینه زنده
پروتکل قصد جدید برای راهاندازی مستقیم فعالیت پیشنمایش تصویر زمینه زنده، بنابراین میتوانید به کاربران کمک کنید به راحتی تصویر زمینه زنده خود را انتخاب کنند بدون اینکه مجبور شوند برنامه شما را ترک کنند و از طریق انتخابگر کاغذدیواری صفحه اصلی پیمایش کنند.
برای راهاندازی انتخابگر تصویر زمینه زنده، startActivity()
را با یک Intent
با استفاده از ACTION_CHANGE_LIVE_WALLPAPER
و یک مورد اضافی که ComponentName
تصویر زمینه زنده شما را بهعنوان یک رشته در EXTRA_LIVE_WALLPAPER_COMPONENT
مشخص میکند، فراخوانی کنید.
پیمایش پشته برنامه
Android 4.1 اجرای الگوهای طراحی مناسب برای ناوبری Up را بسیار ساده تر می کند. تنها کاری که باید انجام دهید این است که android:parentActivityName
به هر عنصر <activity>
در فایل مانیفست خود اضافه کنید. سیستم از این اطلاعات برای باز کردن فعالیت مناسب استفاده می کند زمانی که کاربر دکمه Up را در نوار عمل فشار می دهد (در حالی که فعالیت فعلی را نیز به پایان می رساند). بنابراین اگر android:parentActivityName
برای هر فعالیت اعلام کنید، برای مدیریت رویدادهای کلیک روی نماد برنامه نوار اقدام، به متد onOptionsItemSelected()
نیاز ندارید—حالا سیستم آن رویداد را مدیریت می کند و فعالیت مناسب را از سر می گیرد یا ایجاد می کند.
این به ویژه برای سناریوهایی قدرتمند است که در آن کاربر از طریق یک هدف "شیرجه عمیق" مانند یک اعلان یا یک هدف از برنامه های مختلف (همانطور که در راهنمای طراحی برای پیمایش بین برنامه ها توضیح داده شده است) وارد یکی از فعالیت های برنامه شما می شود. هنگامی که کاربر از این طریق وارد فعالیت شما می شود، ممکن است برنامه شما به طور طبیعی دارای پشته ای از فعالیت ها نباشد که با بالا رفتن کاربر از سر گرفته شود. با این حال، هنگامی که ویژگی android:parentActivityName
برای فعالیتهای خود ارائه میکنید، سیستم تشخیص میدهد که آیا برنامه شما از قبل دارای پشتهای از فعالیتهای والد است یا نه، و اگر نه، یک پشته پشته مصنوعی ایجاد میکند که شامل تمام فعالیتهای والد است.
توجه: هنگامی که کاربر یک فعالیت عمیق را در برنامه شما وارد می کند و یک کار جدید برای برنامه شما ایجاد می کند، سیستم در واقع مجموعه ای از فعالیت های والد را در کار وارد می کند. به این ترتیب، با فشار دادن دکمه برگشت نیز از میان پشته فعالیت های والدین به عقب هدایت می شود.
هنگامی که سیستم یک پشته مصنوعی برای برنامه شما ایجاد می کند، یک Intent
اساسی برای ایجاد یک نمونه جدید از هر فعالیت والد ایجاد می کند. بنابراین، هیچ حالت ذخیرهشدهای برای فعالیتهای والد وجود ندارد، آنطور که انتظار دارید اگر کاربر به طور طبیعی در هر فعالیت پیمایش کند. اگر هر یک از فعالیتهای والد معمولاً یک رابط کاربری را نشان میدهد که به زمینه کاربر وابسته است، آن اطلاعات زمینه از بین میرود و باید زمانی که کاربر در پشته حرکت میکند، آن را تحویل دهید. برای مثال، اگر کاربر در حال مشاهده یک آلبوم در یک برنامه موسیقی است، پیمایش به بالا ممکن است او را به فعالیتی برساند که همه آلبومها را در یک ژانر موسیقی انتخابی فهرست میکند. در این حالت، اگر پشته باید ایجاد شود، لازم است که به فعالیت والد اطلاع دهید که آلبوم فعلی متعلق به چه ژانری است تا والد بتواند لیست مناسب را طوری نمایش دهد که گویی کاربر واقعاً از آن فعالیت آمده است. برای ارائه چنین اطلاعاتی به یک فعالیت والد مصنوعی، باید متد onPrepareNavigateUpTaskStack()
را لغو کنید. این یک شی TaskStackBuilder
را در اختیار شما قرار می دهد که سیستم به منظور ترکیب فعالیت های والد ایجاد کرده است. TaskStackBuilder
شامل اشیاء Intent
است که سیستم از آنها برای ایجاد هر فعالیت والد استفاده می کند. در پیادهسازی onPrepareNavigateUpTaskStack()
میتوانید Intent
مناسب را برای اضافه کردن دادههای اضافی که فعالیت والد میتواند برای تعیین زمینه مناسب و نمایش رابط کاربری مناسب استفاده کند، تغییر دهید.
هنگامی که سیستم TaskStackBuilder
را ایجاد می کند، اشیاء Intent
را اضافه می کند که برای ایجاد فعالیت های والد به ترتیب منطقی خود از بالای درخت فعالیت استفاده می شوند. بنابراین، آخرین Intent
اضافه شده به آرایه داخلی، والد مستقیم فعالیت فعلی است. اگر میخواهید Intent
برای والد فعالیت تغییر دهید، ابتدا طول آرایه را با getIntentCount()
تعیین کنید و آن مقدار را به editIntentAt()
منتقل کنید.
اگر ساختار برنامهتان پیچیدهتر است، چندین API دیگر در دسترس هستند که به شما امکان میدهند رفتار ناوبری Up را مدیریت کنید و پشته مصنوعی را کاملاً سفارشی کنید. برخی از API هایی که به شما کنترل بیشتری می دهند عبارتند از:
-
onNavigateUp()
- وقتی کاربر دکمه Up را فشار میدهد، این را لغو کنید تا یک عمل سفارشی انجام دهید.
-
navigateUpTo(Intent)
- برای پایان دادن به فعالیت فعلی با این تماس بگیرید و به فعالیت نشان داده شده توسط
Intent
ارائه شده بروید. اگر اکتیویتی در پشته پشتی وجود داشته باشد، اما نزدیکترین والد نباشد، تمام فعالیتهای دیگر بین فعالیت فعلی و فعالیت مشخصشده با هدف نیز به پایان میرسد. -
getParentActivityIntent()
- برای دریافت
Intent
که والد منطقی را برای فعالیت فعلی شروع می کند، با این تماس بگیرید. -
shouldUpRecreateTask(Intent)
- برای پیمایش اینکه آیا یک پشته مصنوعی باید برای پیمایش به بالا ایجاد شود، این را صدا بزنید. اگر باید یک پشته مصنوعی ایجاد شود، true، اگر پشته مناسب از قبل وجود داشته باشد، false را برمیگرداند.
-
finishAffinity()
- برای پایان دادن به فعالیت فعلی و تمام فعالیتهای والدین با همان وابستگی وظیفهای که به فعالیت فعلی زنجیر شدهاند، این را صدا بزنید. اگر رفتارهای پیشفرض مانند
onNavigateUp()
را نادیده بگیرید، باید این متد را هنگام ایجاد یک پشته مصنوعی بر روی Up Navigation فراخوانی کنید. -
onCreateNavigateUpTaskStack
- اگر نیاز به کنترل کامل نحوه ایجاد پشته کار مصنوعی دارید، این را لغو کنید. اگر میخواهید به سادگی مقداری داده اضافی به intentهای پشته پشتی خود اضافه کنید، در عوض باید
onPrepareNavigateUpTaskStack()
را لغو کنید.
با این حال، بیشتر برنامهها نیازی به استفاده از این APIها یا پیادهسازی onPrepareNavigateUpTaskStack()
ندارند، اما میتوانند به سادگی با افزودن android:parentActivityName
به هر عنصر <activity>
به رفتار صحیح دست یابند.
چند رسانه ای
کدک های رسانه ای
کلاس MediaCodec
دسترسی به کدک های رسانه ای سطح پایین را برای رمزگذاری و رمزگشایی رسانه شما فراهم می کند. میتوانید با فراخوانی createEncoderByType()
برای رمزگذاری رسانه یا فراخوانی createDecoderByType()
برای رمزگشایی رسانه، یک MediaCodec
نمونهسازی کنید. هر یک از این روشها برای نوع رسانهای که میخواهید رمزگذاری یا رمزگشایی کنید، یک نوع MIME میگیرند، مانند "video/3gpp"
یا "audio/vorbis"
.
با ایجاد یک نمونه از MediaCodec
، سپس میتوانید configure()
را فراخوانی کنید تا ویژگیهایی مانند فرمت رسانه یا اینکه آیا محتوا رمزگذاری شده است یا نه.
چه در حال رمزگذاری یا رمزگشایی رسانه خود باشید، بقیه مراحل پس از ایجاد MediaCodec
یکسان است. ابتدا getInputBuffers()
برای دریافت آرایه ای از اشیاء ByteBuffer
ورودی و getOutputBuffers()
برای دریافت آرایه ای از اشیاء خروجی ByteBuffer
فراخوانی کنید.
هنگامی که برای رمزگذاری یا رمزگشایی آماده هستید، dequeueInputBuffer()
را فراخوانی کنید تا موقعیت نمایه ByteBuffer
(از آرایه بافرهای ورودی) را که باید از آن برای تغذیه در رسانه منبع خود استفاده کنید، بدست آورید. پس از اینکه ByteBuffer
با رسانه منبع خود پر کردید، با فراخوانی queueInputBuffer()
مالکیت بافر را آزاد کنید.
به همین ترتیب برای بافر خروجی، dequeueOutputBuffer()
را فراخوانی کنید تا موقعیت نمایه ByteBuffer
را که در آن نتایج را دریافت خواهید کرد، بدست آورید. پس از خواندن خروجی ByteBuffer
، با فراخوانی releaseOutputBuffer()
مالکیت را آزاد کنید.
میتوانید با فراخوانی queueSecureInputBuffer()
همراه با APIهای MediaCrypto
، به جای queueInputBuffer()
معمولی، دادههای رسانه رمزگذاریشده را در کدکها مدیریت کنید.
برای اطلاعات بیشتر در مورد نحوه استفاده از کدک ها، به مستندات MediaCodec
مراجعه کنید.
ضبط صدا بر روی نشانه
روش جدید startRecording()
به شما امکان می دهد ضبط صدا را بر اساس یک نشانه تعریف شده توسط MediaSyncEvent
شروع کنید. MediaSyncEvent
یک جلسه صوتی (مانند جلسه تعریف شده توسط MediaPlayer
) را مشخص می کند، که پس از تکمیل، ضبط کننده صدا شروع به ضبط می کند. به عنوان مثال، میتوانید از این قابلیت برای پخش یک آهنگ صوتی استفاده کنید که نشاندهنده شروع جلسه ضبط است و ضبط بهطور خودکار شروع میشود، بنابراین نیازی به همگامسازی دستی آهنگ و شروع ضبط ندارید.
آهنگ های متنی زمان بندی شده
MediaPlayer
اکنون تراک های متنی درون باند و خارج از باند را کنترل می کند. آهنگ های متنی درون باند به عنوان یک آهنگ متنی در یک منبع رسانه MP4 یا 3GPP ارائه می شوند. از طریق متد addTimedTextSource()
میتوان آهنگهای متن خارج از باند را به عنوان منبع متن خارجی اضافه کرد. پس از اضافه شدن همه منابع تراک متنی خارجی، getTrackInfo()
باید فراخوانی شود تا فهرست تازهسازی شده تمام آهنگهای موجود در یک منبع داده دریافت شود.
برای تنظیم آهنگ برای استفاده با MediaPlayer
، باید با استفاده از موقعیت فهرست برای آهنگی که میخواهید استفاده کنید selectTrack()
فراخوانی کنید.
برای اطلاع از آماده شدن آهنگ متنی برای پخش، رابط MediaPlayer.OnTimedTextListener
را پیاده سازی کنید و آن را به setOnTimedTextListener()
ارسال کنید.
جلوه های صوتی
کلاس AudioEffect
اکنون از انواع پیش پردازش صوتی اضافی هنگام ضبط صدا پشتیبانی می کند:
- حذف اکو آکوستیک (AEC) با
AcousticEchoCanceler
سهم سیگنال دریافتی از طرف راه دور را از سیگنال صوتی گرفته شده حذف می کند. - کنترل افزایش خودکار (AGC) با
AutomaticGainControl
به طور خودکار خروجی سیگنال گرفته شده را عادی می کند. - سرکوب کننده نویز (NS) با
NoiseSuppressor
نویز پس زمینه را از سیگنال گرفته شده حذف می کند.
میتوانید این جلوههای پیشپردازنده را روی صدای ضبطشده با AudioRecord
با استفاده از یکی از زیرکلاسهای AudioEffect
اعمال کنید.
توجه: تضمین نمیشود که همه دستگاهها از این افکتها پشتیبانی کنند، بنابراین همیشه باید ابتدا با فراخوانی isAvailable()
در کلاس جلوه صوتی مربوطه، دسترسی را بررسی کنید.
پخش بدون شکاف
اکنون می توانید پخش بدون شکاف را بین دو شیء جداگانه MediaPlayer
انجام دهید. در هر زمانی قبل از اتمام اولین MediaPlayer
، setNextMediaPlayer()
را فراخوانی کنید و اندروید سعی می کند پخش کننده دوم را در لحظه ای که پخش اول متوقف می شود شروع کند.
دوربین
حرکت فوکوس خودکار
رابط جدید Camera.AutoFocusMoveCallback
به شما امکان می دهد به تغییرات در حرکت فوکوس خودکار گوش دهید. می توانید رابط کاربری خود را با setAutoFocusMoveCallback()
ثبت کنید. سپس هنگامی که دوربین در حالت فوکوس خودکار مداوم است ( FOCUS_MODE_CONTINUOUS_VIDEO
یا FOCUS_MODE_CONTINUOUS_PICTURE
)، با onAutoFocusMoving()
تماسی دریافت خواهید کرد که به شما می گوید فوکوس خودکار شروع به حرکت کرده است یا از حرکت بازمانده است.
صداهای دوربین
کلاس MediaActionSound
مجموعه ساده ای از API ها را برای تولید صداهای استاندارد ساخته شده توسط دوربین یا سایر اقدامات رسانه ای ارائه می دهد. شما باید از این APIها برای پخش صدای مناسب هنگام ساخت یک دوربین عکاسی یا فیلمبرداری سفارشی استفاده کنید.
برای پخش یک صدا، به سادگی یک شی MediaActionSound
را نمونه سازی کنید، load()
را فراخوانی کنید تا صدای مورد نظر را از قبل بارگذاری کنید، سپس در زمان مناسب، play()
را فراخوانی کنید.
قابلیت اتصال
پرتو اندروید
Android Beam اکنون از انتقال محموله های بزرگ از طریق بلوتوث پشتیبانی می کند. هنگامی که دادهها را برای انتقال با روش جدید setBeamPushUris()
یا رابط تماس جدید NfcAdapter.CreateBeamUrisCallback
تعریف میکنید، اندروید انتقال داده را به بلوتوث یا انتقال جایگزین دیگری واگذار میکند تا به سرعت انتقال سریعتر برسد. این به ویژه برای بارهای بزرگ مانند فایل های تصویری و صوتی مفید است و نیازی به جفت شدن قابل مشاهده بین دستگاه ها ندارد. برنامه شما برای استفاده از انتقال از طریق بلوتوث به کار اضافی نیاز ندارد.
متد setBeamPushUris()
آرایهای از اشیاء Uri
را میگیرد که دادههایی را که میخواهید از برنامه خود انتقال دهید را مشخص میکند. همچنین، میتوانید رابط NfcAdapter.CreateBeamUrisCallback
را پیادهسازی کنید، که میتوانید با فراخوانی setBeamPushUrisCallback()
آن را برای فعالیت خود مشخص کنید.
هنگام استفاده از واسط تماس برگشتی، زمانی که کاربر اشتراکگذاری را با Android Beam اجرا میکند، سیستم متد createBeamUris()
رابط را فراخوانی میکند تا بتوانید URIهایی را برای اشتراکگذاری در زمان اشتراکگذاری تعریف کنید. این در صورتی مفید است که URI های اشتراک گذاری ممکن است بسته به زمینه کاربر در فعالیت متفاوت باشد، در حالی که فراخوانی setBeamPushUris()
زمانی مفید است که URI های اشتراک گذاری بدون تغییر هستند و می توانید با خیال راحت آنها را از قبل تعریف کنید.
کشف خدمات شبکه
Android 4.1 پشتیبانی از اکتشاف سرویس مبتنی بر DNS چندپخشی را اضافه می کند، که به شما امکان می دهد خدمات ارائه شده توسط دستگاه های همتا را از طریق Wi-Fi، مانند دستگاه های تلفن همراه، چاپگرها، دوربین ها، پخش کننده های رسانه و سایر مواردی که در محلی ثبت شده اند، پیدا کنید و به آنها متصل شوید. شبکه
بسته جدید android.net.nsd
حاوی API های جدیدی است که به شما امکان می دهد خدمات خود را در شبکه محلی پخش کنید، دستگاه های محلی را در شبکه کشف کنید و به دستگاه ها متصل شوید.
برای ثبت سرویس خود، ابتدا باید یک شی NsdServiceInfo
ایجاد کنید و ویژگی های مختلف سرویس خود را با متدهایی مانند setServiceName()
، setServiceType()
و setPort()
تعریف کنید.
سپس باید NsdManager.RegistrationListener
را پیاده سازی کنید و آن را با NsdServiceInfo
خود به registerService()
ارسال کنید.
برای کشف سرویس ها در شبکه، NsdManager.DiscoveryListener
را پیاده سازی کنید و آن را به discoverServices()
ارسال کنید.
هنگامی که NsdManager.DiscoveryListener
شما در مورد سرویس های یافت شده تماس های برگشتی دریافت می کند، باید سرویس را با فراخوانی resolveService()
حل کنید، و به آن یک پیاده سازی از NsdManager.ResolveListener
ارسال کنید که یک شی NsdServiceInfo
را دریافت می کند که حاوی اطلاعاتی در مورد سرویس کشف شده است و به شما امکان می دهد اتصال را شروع کنید. .
کشف سرویس Wi-Fi P2P
رابطهای برنامهسازی کاربردی Wi-Fi P2P در Android نسخه 4.1 بهبود یافتهاند تا از کشف سرویس پیش از ارتباط در WifiP2pManager
پشتیبانی کنند. این به شما امکان میدهد قبل از اتصال به Wi-Fi P2P، دستگاههای اطراف را با استفاده از سرویسهای Wi-Fi P2P کشف و فیلتر کنید، در حالی که Network Service Discovery به شما امکان میدهد یک سرویس را در یک شبکه متصل موجود (مانند یک شبکه Wi-Fi محلی) کشف کنید.
برای پخش برنامه خود به عنوان یک سرویس از طریق Wi-Fi به طوری که سایر دستگاه ها بتوانند برنامه شما را پیدا کنند و به آن متصل شوند، با یک شی WifiP2pServiceInfo
که خدمات برنامه شما را توصیف می کند، با addLocalService()
تماس بگیرید.
برای شروع کشف دستگاه های اطراف از طریق Wi-Fi، ابتدا باید تصمیم بگیرید که آیا با استفاده از Bonjour یا Upnp ارتباط برقرار می کنید. برای استفاده از Bonjour، ابتدا تعدادی شنونده پاسخ به تماس را با setDnsSdResponseListeners()
تنظیم کنید که هم WifiP2pManager.DnsSdServiceResponseListener
و هم WifiP2pManager.DnsSdTxtRecordListener
را می گیرد. برای استفاده از Upnp، setUpnpServiceResponseListener()
را فراخوانی کنید که یک WifiP2pManager.UpnpServiceResponseListener
می گیرد.
قبل از اینکه بتوانید خدمات را در دستگاه های محلی شروع کنید، باید با addServiceRequest()
نیز تماس بگیرید. هنگامی که WifiP2pManager.ActionListener
که به این روش منتقل میکنید، یک تماس با موفقیت دریافت میکند، سپس میتوانید با فراخوانی discoverServices()
خدمات را در دستگاههای محلی کشف کنید.
وقتی سرویسهای محلی کشف شدند، بسته به اینکه برای استفاده از Bonjour یا Upnp ثبت نام کردهاید، یک تماس به WifiP2pManager.DnsSdServiceResponseListener
یا WifiP2pManager.UpnpServiceResponseListener
دریافت خواهید کرد. پاسخ تماس دریافتی در هر صورت حاوی یک شی WifiP2pDevice
است که دستگاه همتا را نشان می دهد.
استفاده از شبکه
روش جدید isActiveNetworkMetered()
به شما امکان می دهد بررسی کنید که آیا دستگاه در حال حاضر به یک شبکه اندازه گیری متصل است یا خیر. با بررسی این وضعیت قبل از انجام تراکنشهای شبکه فشرده، میتوانید به مدیریت مصرف دادهای که ممکن است برای کاربرانتان هزینه داشته باشد کمک کنید و تصمیمگیری آگاهانه در مورد انجام تراکنشها اکنون یا بعد (مانند زمانی که دستگاه به Wi-Fi متصل میشود) بگیرید.
قابلیت دسترسی
APIهای سرویس دسترسی
دسترسی به APIهای سرویس دسترسی به طور قابل توجهی در اندروید 4.1 افزایش یافته است. اکنون به شما امکان میدهد تا سرویسهایی بسازید که رویدادهای ورودی بیشتری مانند حرکات پیچیده با استفاده از onGesture()
و سایر رویدادهای ورودی را از طریق اضافهشده به کلاسهای AccessibilityEvent
، AccessibilityNodeInfo
و AccessibilityRecord
ایجاد کنید.
سرویسهای دسترسپذیری همچنین میتوانند اقداماتی را از طرف کاربر انجام دهند، از جمله کلیک کردن، پیمایش و گام برداشتن در متن با استفاده از performAction
و setMovementGranularities
. متد performGlobalAction()
همچنین به سرویسها اجازه میدهد تا اقداماتی مانند بازگشت، صفحه اصلی و باز کردن آخرین برنامهها و اعلانها را انجام دهند.
ناوبری برنامه قابل تنظیم
هنگام ساختن یک برنامه اندروید، اکنون میتوانید طرحهای ناوبری را با یافتن عناصر قابل تمرکز و ویجتهای ورودی با استفاده از findFocus()
و focusSearch()
سفارشی کنید و فوکوس را با استفاده از setAccessibilityFocused()
تنظیم کنید.
ویجت های در دسترس تر
کلاس جدید android.view.accessibility.AccessibilityNodeProvider
به شما امکان می دهد نماهای سفارشی پیچیده را به سرویس های دسترس پذیری نشان دهید تا آنها بتوانند اطلاعات را به روشی در دسترس تر ارائه دهند. android.view.accessibility.AccessibilityNodeProvider
این ساختار معنایی به سرویسهای دسترسی اجازه میدهد تا مدل تعاملی مفیدتری را برای کاربرانی که دارای اختلال بینایی هستند ارائه دهند.
کپی و پیست کنید
کپی و چسباندن با هدف
اکنون می توانید با استفاده از متد setClipData()
یک شی ClipData
با یک Intent
مرتبط کنید. این به ویژه هنگام استفاده از قصد برای انتقال چند content:
URI ها به برنامه دیگری، مانند هنگام به اشتراک گذاری چندین سند. content:
URI های ارائه شده به این روش همچنین به پرچم های intent برای ارائه دسترسی خواندن یا نوشتن احترام می گذارند و به شما امکان می دهند در یک intent به چندین URI دسترسی بدهید. هنگام شروع یک هدف ACTION_SEND
یا ACTION_SEND_MULTIPLE
، URI های ارائه شده در intent اکنون به طور خودکار در ClipData
منتشر می شوند تا گیرنده بتواند به آنها دسترسی داشته باشد.
پشتیبانی از HTML و سبک های رشته ای
کلاس ClipData
اکنون از متن استایل داده شده (به صورت رشته های سبک HTML یا Android) پشتیبانی می کند. میتوانید با newHtmlText()
متنی به سبک HTML به ClipData
اضافه کنید.
Renderscript
عملکرد محاسبه Renderscript با ویژگی های زیر افزایش یافته است:
- پشتیبانی از چندین هسته در یک اسکریپت.
- پشتیبانی از خواندن از تخصیص با نمونهگرهای فیلتر شده از محاسبه در یک اسکریپت جدید API
rsSample
. - پشتیبانی از سطوح مختلف دقت FP در
#pragma
. - پشتیبانی از جستجوی اطلاعات اضافی از اشیاء RS از یک اسکریپت محاسباتی.
- بهبود عملکردهای متعدد
پراگماهای جدید نیز برای تعریف دقت ممیز شناور مورد نیاز رندر اسکریپت های محاسباتی شما در دسترس هستند. این به شما امکان می دهد عملیات های مشابه NEON مانند عملیات ریاضی برداری سریع در مسیر CPU را فعال کنید که در غیر این صورت با استاندارد کامل IEEE 754-2008 امکان پذیر نیست.
توجه: موتور گرافیکی آزمایشی Renderscript اکنون منسوخ شده است.
انیمیشن
انیمیشن های راه اندازی فعالیت
اکنون می توانید یک Activity
با استفاده از انیمیشن های بزرگنمایی یا انیمیشن های سفارشی خود راه اندازی کنید. برای مشخص کردن انیمیشنی که میخواهید، از APIهای ActivityOptions
برای ایجاد یک Bundle
استفاده کنید که سپس میتوانید آن را به هر یک از متدهایی که یک فعالیت را شروع میکنند، مانند startActivity()
منتقل کنید.
کلاس ActivityOptions
شامل یک روش متفاوت برای هر نوع انیمیشنی است که ممکن است بخواهید با باز شدن فعالیت خود نشان دهید:
-
makeScaleUpAnimation()
- انیمیشنی ایجاد می کند که پنجره فعالیت را از یک موقعیت شروع مشخص روی صفحه و یک اندازه شروع مشخص افزایش می دهد. به عنوان مثال، صفحه اصلی در اندروید 4.1 هنگام باز کردن یک برنامه از این مورد استفاده می کند.
-
makeThumbnailScaleUpAnimation()
- یک انیمیشن ایجاد می کند که پنجره فعالیت را با شروع از یک موقعیت مشخص و یک تصویر کوچک ارائه شده افزایش می دهد. به عنوان مثال، پنجره برنامههای اخیر در Android 4.1 از این هنگام بازگشت به یک برنامه استفاده میکند.
-
makeCustomAnimation()
- یک انیمیشن تعریف شده توسط منابع خود شما ایجاد می کند: یکی که انیمیشن را برای باز شدن فعالیت تعریف می کند و دیگری برای فعالیتی که متوقف می شود.
انیماتور زمان
TimeAnimator
جدید یک مکانیسم پاسخگویی ساده با TimeAnimator.TimeListener
ارائه می دهد که شما را در هر فریم از انیمیشن مطلع می کند. هیچ مدت زمان، درون یابی یا تنظیم ارزش شی با این انیماتور وجود ندارد. پاسخ تماس شنونده اطلاعاتی را برای هر فریم از جمله کل زمان سپری شده و زمان سپری شده از فریم انیمیشن قبلی دریافت می کند.
رابط کاربری
اطلاعیه ها
در اندروید 4.1، میتوانید اعلانهایی با مناطق محتوای بزرگتر، پیشنمایشهای تصویر بزرگ، دکمههای عمل متعدد و اولویت قابل تنظیم ایجاد کنید.
سبک های اطلاع رسانی
متد جدید setStyle()
به شما امکان می دهد یکی از سه سبک جدید را برای اعلان خود مشخص کنید که هر یک منطقه محتوای بزرگتری را ارائه می دهند. برای تعیین سبک برای منطقه محتوای بزرگ خود، setStyle()
یکی از اشیاء زیر را ارسال کنید:
-
Notification.BigPictureStyle
- برای اعلانهایی که شامل یک پیوست تصویر بزرگ است.
-
Notification.BigTextStyle
- برای اعلانهایی که شامل متن زیادی است، مانند یک ایمیل.
-
Notification.InboxStyle
- برای اعلانهایی که شامل فهرستی از رشتهها هستند، مانند قطعههایی از چندین ایمیل.
اقدامات اطلاع رسانی
اکنون حداکثر دو دکمه عمل که در پایین پیام اعلان ظاهر می شوند، پشتیبانی می شود، چه اعلان شما از سبک معمولی یا بزرگتر استفاده کند.
برای افزودن یک دکمه اقدام، addAction()
را فراخوانی کنید. این متد سه آرگومان میگیرد: یک منبع قابل ترسیم برای یک نماد، متن برای دکمه، و یک PendingIntent
که عمل را برای انجام تعریف میکند.
اولویت ها
اکنون می توانید با تنظیم اولویت با setPriority()
به سیستم اشاره کنید که اعلان شما چقدر در ترتیب اعلان شما در لیست تأثیر دارد. میتوانید این یکی از پنج سطح اولویت مختلف را که با ثابتهای PRIORITY_*
در کلاس Notification
تعریف شده است، پاس کنید. پیشفرض PRIORITY_DEFAULT
است و دو سطح بالاتر و دو سطح پایینتر وجود دارد.
اعلانهای با اولویت بالا چیزهایی هستند که کاربران معمولاً میخواهند به سرعت به آنها پاسخ دهند، مانند پیام فوری جدید، پیام متنی یا یادآوری رویداد قریبالوقوع. اعلانهای با اولویت پایین چیزهایی مانند رویدادهای تقویم منقضی شده یا تبلیغات برنامه هستند.
کنترل برای رابط کاربری سیستم
Android 4.0 (Ice Cream Sandwich) پرچمهای جدیدی را برای کنترل نمایان بودن عناصر رابط کاربری سیستم اضافه کرد، مانند کمنور کردن ظاهر نوار سیستم یا ناپدید شدن کامل آن در گوشیها. Android 4.1 چند پرچم دیگر اضافه میکند که به شما امکان میدهد با فراخوانی setSystemUiVisibility()
و ارسال پرچمهای زیر، ظاهر عناصر UI سیستم و طرحبندی فعالیتهای خود را در رابطه با آنها کنترل کنید:
-
SYSTEM_UI_FLAG_FULLSCREEN
- رابط کاربری غیر بحرانی سیستم (مانند نوار وضعیت) را پنهان می کند. اگر فعالیت شما از نوار اکشن در حالت همپوشانی استفاده میکند (با فعال کردن
android:windowActionBarOverlay
)، این پرچم نوار اکشن را نیز پنهان میکند و این کار را با یک انیمیشن هماهنگ در هنگام پنهان کردن و نمایش این دو انجام میدهد. -
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- طرحبندی فعالیت شما را به گونهای تنظیم میکند که از همان ناحیه صفحه استفاده کند که وقتی
SYSTEM_UI_FLAG_FULLSCREEN
فعال کردهاید در دسترس است، حتی اگر عناصر رابط کاربری سیستم هنوز قابل مشاهده باشند. اگرچه بخشهایی از طرحبندی شما توسط رابط کاربری سیستم همپوشانی میشود، اما اگر برنامه شما اغلب رابط کاربری سیستم را باSYSTEM_UI_FLAG_FULLSCREEN
پنهان میکند و نشان میدهد، مفید است، زیرا هر بار که رابط کاربری سیستم پنهان یا ظاهر میشود، از تنظیم طرحبندی شما با محدودههای طرحبندی جدید جلوگیری میکند. -
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- طرحبندی فعالیت شما را به گونهای تنظیم میکند که از همان ناحیه صفحه استفاده کند که وقتی
SYSTEM_UI_FLAG_HIDE_NAVIGATION
(افزوده شده در Android 4.0) را فعال کردهاید، در دسترس است، حتی اگر عناصر رابط کاربری سیستم همچنان قابل مشاهده باشند. اگرچه بخشهایی از طرحبندی شما توسط نوار پیمایش همپوشانی میشود، اما اگر برنامه شما اغلب نوار پیمایش را باSYSTEM_UI_FLAG_HIDE_NAVIGATION
پنهان کرده و نشان دهد، مفید است، زیرا هر بار که نوار پیمایش پنهان یا ظاهر میشود، از تنظیم طرحبندی شما با محدودههای طرحبندی جدید جلوگیری میکند. -
SYSTEM_UI_FLAG_LAYOUT_STABLE
- اگر از
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
و/یاSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
استفاده میکنید، ممکن است بخواهید این پرچم را اضافه کنید تا اطمینان حاصل کنید که هنگام فراخوانیfitSystemWindows()
در یک دیدگاه، محدودههای تعریفشده با توجه به فضای صفحه موجود مطابقت دارند. یعنی با این مجموعه پرچم،fitSystemWindows()
طوری رفتار می کند که گویی نمایان شدن عناصر رابط کاربری سیستم بدون تغییر است، حتی پس از اینکه تمام رابط کاربری سیستم را مخفی کنید.
برای بحث بیشتر در مورد سایر پرچمهای رابط کاربری سیستم مرتبط، در مورد موارد اضافه شده در Android 4.0 مطالعه کنید.
نماهای از راه دور
GridLayout
و ViewStub
اکنون نماهای قابل راه دوری هستند، بنابراین می توانید از آنها در طرح بندی ویجت های برنامه خود و طرح بندی های سفارشی اعلان ها استفاده کنید.
خانواده های فونت
Android 4.1 چندین نوع دیگر از سبک فونت Roboto را برای مجموع 10 نوع اضافه می کند و همه آنها توسط برنامه ها قابل استفاده هستند. اکنون برنامه های شما به مجموعه کاملی از انواع سبک و فشرده دسترسی دارند.
مجموعه کامل انواع فونت Roboto موجود است:
- منظم
- کج
- پررنگ
- پررنگ-مورب
- نور
- کج روشن
- منظم متراکم شده
- مورب متراکم
- پررنگ متراکم شده
- پررنگ-مورب متراکم
می توانید هر یک از اینها را با ویژگی fontFamily
جدید در ترکیب با ویژگی textStyle
اعمال کنید.
مقادیر پشتیبانی شده برای fontFamily
عبارتند از:
-
"sans-serif"
برای Roboto معمولی -
"sans-serif-light"
برای Roboto Light -
"sans-serif-condensed"
برای Roboto Condensed
سپس می توانید با مقادیر textStyle
"bold"
و "italic"
پررنگ و/یا ایتالیک اعمال کنید. می توانید هر دو را مانند اینها اعمال کنید: android:textStyle="bold|italic"
.
همچنین می توانید از Typeface.create()
استفاده کنید. برای مثال Typeface.create("sans-serif-light", Typeface.NORMAL)
.
چارچوب ورودی
دستگاه های ورودی چندگانه
کلاس جدید InputManager
به شما این امکان را می دهد که مجموعه دستگاه های ورودی فعلی متصل شده را جستجو کنید و ثبت نام کنید تا در صورت اضافه شدن، تغییر یا حذف یک دستگاه جدید مطلع شوید. این به ویژه در صورتی مفید است که در حال ساخت بازی ای هستید که از چندین بازیکن پشتیبانی می کند و می خواهید تشخیص دهید که چند کنترلر متصل شده اند و چه زمانی تغییراتی در تعداد کنترلرها وجود دارد.
میتوانید با فراخوانی getInputDeviceIds()
تمام دستگاههای ورودی متصل را پرس و جو کنید. این آرایه ای از اعداد صحیح را برمی گرداند، که هر کدام یک شناسه برای یک دستگاه ورودی متفاوت است. سپس می توانید getInputDevice()
را برای بدست آوردن یک InputDevice
برای شناسه دستگاه ورودی مشخص شده فراخوانی کنید.
اگر میخواهید از اتصال، تغییر یا قطع شدن دستگاههای ورودی جدید مطلع شوید، رابط InputManager.InputDeviceListener
پیادهسازی کنید و آن را با registerInputDeviceListener()
ثبت کنید.
لرزش برای کنترل کننده های ورودی
اگر دستگاههای ورودی متصل قابلیت ارتعاش خاص خود را دارند، اکنون میتوانید لرزش آن دستگاهها را با استفاده از APIهای Vibrator
موجود به سادگی با فراخوانی getVibrator()
در InputDevice
کنترل کنید.
مجوزها
موارد زیر مجوزهای جدید هستند:
-
READ_EXTERNAL_STORAGE
- دسترسی خواندن محافظت شده به حافظه خارجی را فراهم می کند. در اندروید 4.1 به طور پیش فرض همه برنامه ها هنوز دسترسی خواندن دارند. این مورد در نسخه بعدی تغییر خواهد کرد تا برنامهها با استفاده از این مجوز صریحاً درخواست دسترسی خواندن کنند. اگر برنامه شما قبلاً درخواست دسترسی نوشتن داشته باشد، به طور خودکار دسترسی خواندن نیز دریافت می کند. یک گزینه توسعهدهنده جدید برای فعال کردن محدودیت دسترسی به خواندن وجود دارد تا توسعهدهندگان برنامههای خود را در برابر نحوه رفتار اندروید در آینده آزمایش کنند.
- android.Manifest.permission.READ_USER_DICTIONARY
- به یک برنامه کاربردی اجازه می دهد تا فرهنگ لغت کاربر را بخواند. این فقط باید توسط یک IME یا یک ویرایشگر فرهنگ لغت مانند برنامه تنظیمات مورد نیاز باشد.
-
READ_CALL_LOG
- به یک برنامه کاربردی اجازه می دهد تا گزارش تماس های سیستم را که حاوی اطلاعات تماس های ورودی و خروجی است بخواند.
-
WRITE_CALL_LOG
- به یک برنامه کاربردی اجازه می دهد تا گزارش تماس های ذخیره شده در تلفن شما را تغییر دهد
- android.Manifest.permission.WRITE_USER_DICTIONARY
- به یک برنامه کاربردی اجازه می دهد تا در فرهنگ لغت کاربر بنویسد.
ویژگی های دستگاه
Android 4.1 شامل یک اعلامیه ویژگی جدید برای دستگاههایی است که به نمایش رابط کاربری در صفحه تلویزیون اختصاص داده شدهاند: FEATURE_TELEVISION
. برای اعلام اینکه برنامه شما به یک رابط تلویزیونی نیاز دارد، این ویژگی را در فایل مانیفست خود با عنصر <uses-feature>
اعلام کنید:
<manifest ... > <uses-feature android:name="android.hardware.type.television" android:required="true" /> ... </manifest>
این ویژگی «تلویزیون» را به عنوان یک تجربه تلویزیونی معمولی در اتاق نشیمن تعریف می کند: نمایش داده شده بر روی یک صفحه نمایش بزرگ، جایی که کاربر در دوردستی نشسته است و شکل غالب ورودی چیزی شبیه به d-pad است، و به طور کلی نه از طریق لمس یا یک ماوس/دستگاه اشاره گر